옵셔널값을 언래핑해야 할 때나, 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 |