728x90
반응형
[ 옵셔널 체이닝 ]
옵셔널 체이닝은 옵셔널 요소 내부의 프로퍼티로 또다시 옵셔널이 연속적으로 연결되는 경우 연쇄적으로 프로퍼티를 불러올 수 있도록 해 준다.
아래와 같이 사람과 아파트를 의미하는 2개의 클래스를 정의하고, 2명의 사람과 1개의 아파트 인스턴스를 생성해주었다.
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
}
}
// 꼭 필요한 프로퍼티들만 할당하여 3개의 인스턴스 생성
let kybeen: Person? = Person(name: "kybeen")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
만약 여기서 [ 우리집 경비원의 직업 ]이 궁금하다면??
- 옵셔널 체이닝 사용 X
옵셔널 체이닝을 사용하지 않을 경우 옵셔널 바인딩을 통한 확인 작업을 여러번 거치면서 아래와 같은 지저분한 코드가 작성된다.
// 옵셔널 체이닝 사용 X
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("우리집 경비원은 직업이 없어요.")
}
}
}
}
}
- 옵셔널 체이닝 사용
하지만 옵셔널 체이닝을 사용하면 연쇄 작용을 통해서 아래와 같이 코드가 훨씬 직관적이고 깔끔해진다.
owner --> home --> guard --> job 의 순서로 확인을 거치며, 중간에 nil 값이 나온다면 더이상 진행하지 않고 멈춰서 nil을 반환해준다.
// 옵셔널 체이닝 사용
func guardJobWithOptionalChaining(owner: Person?) {
// 한번에 연결해서 확인
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다.")
} else {
print("우리집 경비원은 직업이 없어요.")
}
}
- 옵셔널 체인 사용 예시
[ nil 병합 연산자 - ?? ]
nil 병합 연산자인 ?? 를 통해 옵셔널 체이닝의 결과가 nil일 경우 지정된 값으로 병합시켜줄 수 있다.
// nil 병합 연산자 - ??
var guardJob: String
// ~~~.job 값이 nil이라면 "슈퍼맨"을 할당
guardJob = kybeen?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // "경비원" 값이 할당되어 있기 때문에 그대로 "경비원"임
kybeen?.home?.guard?.job = nil // "경비원" 말고 nil 할당
guardJob = kybeen?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // nil값이기 때문에 "슈퍼맨" 값을 할당해줌
728x90
반응형
'Swift' 카테고리의 다른 글
[ Swift ] Swift 기초 문법13 - assert와 guard (0) | 2023.02.19 |
---|---|
[ Swift ] Swift 기초 문법12 - 타입캐스팅 (0) | 2023.02.19 |
[ Swift ] Swift 기초 문법10 - 인스턴스의 생성과 소멸 (0) | 2023.02.19 |
[ Swift ] Swift 기초 문법9 - 프로퍼티 (0) | 2023.02.17 |
[ Swift ] Swift 기초 문법8 - 클로저 (0) | 2023.01.30 |