본문 바로가기
Swift

Swift Optional unWrapping을 좀 더 간편하게 쓰는 법

by zinozino 2023. 4. 20.

옵셔널값을 언래핑해야 할 때나, closure안 캡처리스트 (ex: [weak self] in …) 약한 참조 접근을 많이 한다면  if let, guard let을 사용합니다.

 

final class CapturedClass {
    
    private var afterExecutor: AfterExecutor
    private var optionalModel: OptionalModel?
    
    init(afterExecutor: AfterExecutor) {
        self.afterExecutor = afterExecutor
    }
    
    private func functionCall() {
        
        afterExecutor.after(time: 3) { [weak self] in
            self?.interalFunction()
            self?.interalFunction2()
            self?.interalFunction3()
        }
    }
    
    private func interalFunction() {
        print(print("execute CapturedClass's  method call"))
    }
    private func interalFunction2() {
        print(print("execute CapturedClass's  method2 call"))
    }
    private func interalFunction3() {
        print(print("execute CapturedClass's  method3 call"))
    }
}

final class AfterExecutor {
    
    func after(time: TimeInterval, completion:  @escaping () -> ()) {
        DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + time) {
            completion()
        }
    }
}

하나의 self?.interalFunction()을 접근할 때는 굳이 언랩핑을 할 필요가 없지만

self에 참조하는 일이 많을수록 옵셔널을 붙여주는 게 가독성이 좋지 않을 수 있습니다.

 

afterExecutor.after(time: 3) { [weak self] in
	guard let self else { return }
	self.interalFunction()
	self.interalFunction2()
	self.interalFunction3()
}

그래서  guard let self = self else { return }을 쓰고 있습니다.

 

guard let self else { return }
if let self { ... }
afterExecutor.after(time: 3) { [weak self] in
	guard let self else { return }
	self.interalFunction()
	self.interalFunction2()
	self.interalFunction3()
}

 

Swift 5.7에서는 

상수 또는 변수에 할당할 필요 없이 같은 이름으로 언래핑이 가능합니다.

Swift 5.7이상을 사용한다면 해당 방식을 추천합니다.

 


언랩핑할 대상이 다른 객체의 프로퍼티라면 불가능합니다.

 

private var optionalModel: OptionalModel?

afterExecutor.after(time: 3) { [weak self] in
    guard let self else { return }
    guard let self.optionalModel else { return } // error Unwrap condition requires a valid identifier
    guard let model = self.optionalModel else { return } // OK 						
}

이상입니다.

'Swift' 카테고리의 다른 글

\Root.Value 는 (Root) -> Value이다  (1) 2023.09.26
Swift에서 Map 만들어보기  (1) 2023.05.03
Array에서 중복 제거하는 방법  (0) 2023.04.19
Array의 index를 안전하게 처리하는 방법  (2) 2023.04.18
KeyPath  (2) 2023.01.16