옵셔널 체이닝
옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 떄 활용할 수 있다.
매 번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있다.
Person 클래스의 home 이라는 프로퍼티는 Apartment 클래스 타입을 사용한다.
Apartment 클래스의 guard, owner 프로퍼티는 Person 클래스 타입을 사용한다.
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 `guard`: Person?
var owner: Person?
init(dong: String, ho: String) {
buildingNumber = dong
roomNumber = ho
}
}
옵셔널 체이닝 사용
먼저 변수를 선언한다.
let jerry: Person? = Person(name: "jerry")
let jerryHome: Apartment? = Apartment(dong: "202", ho: "202")
let tom: Person? = Person(name: "tom")
옵셔널 체이닝이 실행 후 결과값이 nil일 수도 있기 때문에
결과 타입도 옵셔널이다.
guard의 직업을 알고 싶은 경우에
먼저 옵셔널 체이닝을 사용하지 않는다면?
func guardJob(owner: Person?) {
if let owner = owner {
if let home = owner.home {
if let `guard` = home.guard {
if let guardJob = `guard`.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
}
}
}
guardJob(owner: jerry)
옵셔널 체이닝을 사용한다면?
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
guardJobWithOptionalChaining(owner: jerry)
// 우리집 경비원은 직업이 없어요
nil 병합 연산자
중위 연산자 "??" 사용한다.
띄어쓰기를 유의한다.
var guardJob: String
guardJob = jerry!.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨
'Swift > 기본' 카테고리의 다른 글
프로토콜 (0) | 2024.04.11 |
---|---|
assert와 guard (0) | 2024.04.09 |
인스턴스의 생성과 소멸 (0) | 2024.04.05 |
상속 (0) | 2024.04.04 |
프로퍼티 (0) | 2024.04.03 |