
nil일 수도 있는 프로퍼티나 메서드, 서브크립트에 질의(Query)를 하는 과정
nil이라면 nil을 반환nil일 경우 전체 결과는 nilimport Foundation
struct SomeOptionalStruct {
var someOptionalProperty: Int?
}
class SomeOptionalClass {
var someOptionalStruct: SomeOptionalStruct?
init() {
someOptionalStruct = SomeOptionalStruct()
}
}
let someOptionalClass: SomeOptionalClass? = SomeOptionalClass()
print(someOptionalClass?.someOptionalStruct?.someOptionalProperty)
// nil
someOptionalClass?.someOptionalStruct?.someOptionalProperty = 3
print(someOptionalClass?.someOptionalStruct?.someOptionalProperty)
// Optional(3)
Objective-C의 nil 메시징
옵셔널 체이닝은 Objective-C의 nil 메시징과 유사
- 차이점
- reference type 뿐만 아니라 primitive type에서도 사용 가능
- 값을 가져올 때, 성공 및 실패 여부 확인 가능
옵셔널 체이닝은 옵셔널 값 뒤에 ?를 붙여서 표현
강제 언래핑은 옵셔널 값 뒤에 !를 붙여서 표현
| 옵셔널 체이닝 | 강제 언래핑 | |
|---|---|---|
nil값 호출 시 | nil값 반환 | 런타임 에러 발생 |
| 반환 타입 | 옵셔녈 | 옵셔널이 아닌 타입 자체 |
옵셔널 체이닝은 호출 시 런타임 에러가 발생하지 않기 때문에 안정적이지만
옵셔널 언래핑이 필요한 상황이라면 코드가 다소 길어질 수 있다.
if let 혹은 guard let 구문으로 옵셔널 언래핑을 진행하고, 값을 가져오는데에 성공했는지 실패했는지 알 수 있다.
if letif let value = someClass?.someProperty {
print(value)
} else {
print("value is nil")
}
guard letguard let value = someClass?.someProperty else {
print("value is nil")
return // 메서드 내부에 있다고 가정
}
print(value)
Void를 반환Void?를 반환if문 등으로 값이 nil인지 확인하여 값을 가져오는 데에 성공하였는지 판단 가능여러 단계에 걸쳐 옵셔널 체이닝을 연결 가능
Optinal(Optinal(Optional(..))) XsomeClass?.someMethodA()?.someMethodB()?. ...