nil
일 수도 있는 프로퍼티나 메서드, 서브크립트에 질의(Query)를 하는 과정
nil
이라면 nil
을 반환nil
일 경우 전체 결과는 nil
import 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 let
if let value = someClass?.someProperty {
print(value)
} else {
print("value is nil")
}
guard let
guard let value = someClass?.someProperty else {
print("value is nil")
return // 메서드 내부에 있다고 가정
}
print(value)
Void
를 반환Void?
를 반환if
문 등으로 값이 nil
인지 확인하여 값을 가져오는 데에 성공하였는지 판단 가능여러 단계에 걸쳐 옵셔널 체이닝을 연결 가능
Optinal(Optinal(Optional(..))) X
someClass?.someMethodA()?.someMethodB()?. ...