정의
- nil일 수도 있는 프로퍼티나 메서드 그리고 서브 스크립트에 질의를 하는 과정입니다.
- 옵셔널이 프로퍼티나 메서드 혹은 서브스크립트에 대한 값을 가지고 있다면, 그 값을 반환합니다. ( nil값이면 nil 반환 )
- 여러 질의를 연결해서 할 수 있으며, 연결된 질의 중 하나라도 nil이면 전체 결과는 nil이 됩니다.
예제
클래스 생성
- Person Class와 Apartment Class를 생성하겠습니다.
- Person Class는 사람에 대한 정보를 갖는 클래스이고, Apartment는 집에 대한 정보를 갖는 클래스입니다.
- Person Class에 home 프로퍼티와 Apartment Class에 man, owner 프로퍼티에는 nil값으로 초기화되어 있습니다.
class Person {
var name: String
var job: String?
var home: Apartment?
init(name: String) {
self.name = name
}
}
class Apartment {
var buildingNumber: String
var roomNumber: String
var man: Person?
var owner: Person?
init(dong: String, ho: String){
buildingNumber = dong
roomNumber = ho
}
}
인스턴스 생성
- 두 개의 클래스에 해당하는 인스턴스를 생성하겠습니다.
let SeaGreen: Person? = Person(name: "SeaGreen")
let apart: Apartment? = Apartment(dong: "101", ho: "101")
let superman: Person? = Person(name: "superman")
옵셔널 체이닝을 사용하지 않는 경우
- 옵셔널 체이닝을 사용하지 않고 코드를 작성한다면, 다음과 같은 코드가 작성됩니다.
- if let을 통해 nil값을 확인하며 긴 코드가 작성됩니다.
func guardJob(owner: Person?) {
if let owner = owner {
if let home = owner.home {
if let man = home.man {
if let guardJob = man.job {
print("아파트에 사는 남자의 직업은 \(guardJob)입니다.")
} else {
print("아파트에 사는 남자는 직업이 없습니다.")
}
}
}
}
}
옵셔널 체이닝을 사용하는 경우
- 옵셔널 체이닝을 사용하는 경우엔 "owner?.home?.man?.job"처럼 코드를 작성해,
연쇄적으로 프로퍼티에 값이 있는지를 확인합니다.
- "owner?.home?.man?.job"을 검사하는 단계 중 하나라도 nil 값에 해당하면 전체 결과는 nil값이 됩니다.
func optionalChaining(owner: Person?){
if let guardJob = owner?.home?.man?.job {
print("아파트에 사는 남자의 직업은 \(guardJob)입니다.")
} else {
print("아파트에 사는 남자는 직업이 없습니다.")
}
}
optionalChaining(owner: SeaGreen)
옵셔널 체이닝 값 할당
- 옵셔널 체이닝을 통해 값을 불러오려했을때, nil값이 나오며 실행이 종료되었을 것입니다.
- 아래 코드를 통해 값을 할당하지 않았을 때, 어떤 결과가 출력될지 확인할 수 있습니다.
SeaGreen?.home?.man?.job // nil
SeaGreen?.home = apart
SeaGreen?.home // Optional(Apartment)
SeaGreen?.home?.man // nil
SeaGreen?.home?.man = superman
SeaGreen?.home?.man // Optional(Person)
SeaGreen?.home?.man?.name // superman
SeaGreen?.home?.man?.job // nil
SeaGreen?.home?.man?.job = "경비원"
nil 병합 연산자
- 옵셔널 체이닝을 통해 옵셔널 값이 아닌 기본값을 사용하려면 nil 병합 연산자를 사용하면 됩니다.
- nil 병합 연산자는 ?? 앞의 값이 nil이라면 뒤의 작성된 코드를 실행하는 문법입니다.
- 위의 예제에서 SeaGreen?.home?.man?.job = "경비원" 이라는 코드를 작성했기 때문에,
SeaGreen?.home?.man?.job 값에는 경비원이라는 값이 들어있습니다. 따라서 첫 번째 구문의 실행결과는 "경비원"
이라는 값이 출력될 것입니다.
- 첫 번째 구문이 끝나고 SeaGreen?.home?.man?.job = nil을 통해 SeaGreen?.home?.man?.job에 nil값을 할당했습니다.
그렇기 때문에 두 번째 구문의 실행결과는 "슈퍼맨"이라는 값이 출력될 것입니다.
var guardJob: String
guardJob = SeaGreen?.home?.man?.job ?? "슈퍼맨"
print(guardJob)
SeaGreen?.home?.man?.job = nil
guardJob = SeaGreen?.home?.man?.job ?? "슈퍼맨"
print(guardJob)
내용 출처
https://www.youtube.com/watch?v=UANvklNnDeg
https://jusung.gitbook.io/the-swift-language-guide/language-guide/16-optional-chaining
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
서브스크립트 [ Subscript ] (0) | 2022.02.15 |
---|---|
프로퍼티 [ Properties ] (0) | 2022.02.14 |
inout (0) | 2022.02.09 |
mutating (0) | 2022.02.09 |
제네릭 [ Generic ] (0) | 2022.02.08 |
댓글