[Swift] (기초) Optional Chaining / 옵셔널 체이닝
2021. 8. 28. 01:06ㆍ🍏/Swift 기초 공부
옵셔널 체이닝 특징
- 옵셔널 체인으로 참조된 값은 무조건 옵셔널 타입으로 반환된다.
- 옵셔널 체인 과정에서 옵셔널 타입들이 여러 번 겹쳐 있더라도 중첩되지 않고 한 번만 처리된다.
struct Human {
var name: String?
var man: Bool = true
}
struct Company {
var ceo: Human?
var companyName: String?
}
var startup: Company? = Company(ceo: Human(name: "CHANHIHI", man: true), companyName: "chan")
if let name = startup?.ceo?.name {
print(name)
}
startup?.ceo?.name = "HIHI"
print(startup?.ceo?.name)
// 마지막 값이 일반 값이어도 옵셔널
// 옵셔널 체인 구문 자체가 nil을 반환할 가능성을 내포하고 있기 때문.
더보기
// 1. 옵셔널 체이닝
// 옵셔널 체이닝은 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용할 수 있습니다.
// 매번 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 `guard`: Person?
var owner: Person?
init(dong: String, ho: String) {
buildingNumber = dong
roomNumber = ho
}
}
// 옵셔널 체이닝 사용
let chan: Person? = Person(name: "chan")
let apart: Apartment? = Apartment(dong: "1004", ho: "1004")
let superman: Person? = Person(name: "superman")
// 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로
// 결과 타입도 옵셔널입니다
// 만약 우리집의 경비원의 직업이 궁금하다면..?
// 옵셔널 체이닝을 사용하지 않는다면...
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: chan)
// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
guardJobWithOptionalChaining(owner: chan)
// 우리집 경비원은 직업이 없어요
chan?.home?.guard?.job // nil
chan?.home = apart
chan?.home // Optional(Apartment)
chan?.home?.guard // nil
// 경비원 할당
chan?.home?.guard = superman
chan?.home?.guard // Optional(Person)
chan?.home?.guard?.name // superman
chan?.home?.guard?.job // nil
chan?.home?.guard?.job = "경비원"
// 2. nil 병합 연산자
// 중위 연산자입니다. ??
// Optional ?? Value
// 옵셔널 값이 nil일 경우, 우측의 값을 반환합니다.
// 띄어쓰기에 주의하여야 합니다.
var guardJob: String
guardJob = chan?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원
chan?.home?.guard?.job = nil
guardJob = chan?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨
'🍏 > Swift 기초 공부' 카테고리의 다른 글
[Swift] (기초) Assert & Guard / Assertion / Early Exit / Guard (0) | 2021.09.01 |
---|---|
[Swift] (기초) Type Casting / 타입 캐스팅 / 다운 캐스팅 / 업 캐스팅 (0) | 2021.09.01 |
[Swift] (기초) Instance / 인스턴스 생성 & 소멸 (init & deinit) (0) | 2021.08.24 |
[Swift] (기초) Property / 프로퍼티 (0) | 2021.08.24 |
[Swift] (기초) Closures / 클로저 (0) | 2021.08.24 |