옵셔널 체이닝 Optional Chaining
- 옵셔널 타입에 대해 접근연산자를 호출하는 방법
- 옵셔널 체이닝의 결과는 항상 옵셔널 (if let 바인딩이나, 강제 언래핑으로 벗겨줘야 함)
- 옵셔널 체이닝의 값 중에 하나라도 nil이면, 이어지는 표현식 평가하지 않고 nil 리턴
class Dog {
var name: String?
var weight: Int
init(name: String, weight: Int) {
self.name = name
self.weight = weight
}
func sit() {
print("\(self.name)가 앉았습니다.")
}
func layDown() {
print("누웠습니다.")
}
}
class Human {
var dog: Dog?
}
var choco = Dog(name: "초코", weight: 15)
choco.name
choco.sit()
var human = Human()
human.dog = choco
human.dog?.name
print(human2!.dog!.name)
print(human2!.dog!.name!)
print(human2!.dog!.weight)
if let name = human2?.dog?.name {
print(name)
}
var defaultName = human2?.dog?.name ?? "멍탱구리"
print(defaultName)
활용 예시
옵셔널 체이닝 - 함수 관련
class Cat {
var name: String?
var myMaster: ( () -> Person? )?
init (aFunction: @escaping () -> Person?) {
self.myMaster = aFunction
}
}
class Person {
var name: String?
}
func meowmeow() -> Person? {
let person = Person()
person.name = "Jobs"
return person
}
var cat: Cat? = Cat(aFunction: meowmeow)
var name = cat?.myMaster?()?.name
if let name = cat?.myMaster?()?.name {
print(name)
}
옵셔널 체이닝 - 딕셔너리 관련
class Library1 {
var books: [String: Person]?
}
var person1 = Person()
person1.name = "Jobs"
print(person1.name)
var person2 = Person()
person2.name = "Musk"
var library = Library1()
library.books = ["Apple": person1, "Tesla": person2]
if let name = library.books?["Apple"]?.name {
print("이름 : ", name)
}
옵셔널 체이닝 - 함수의 실행
- 옵셔널 타입에 접근해서 사용하는 함수는 앞의 타입을 벗기지 않아도 사용가능하다
함수 자체가 옵셔널은 아니기 때문에 함수를 벗길 필요가 없다
- 함수가 리턴형이 없는 경우
- 타입에 값이 있으면 함수 실행
- 타입에 값이 없으면 nil
- 함수가 리턴형이 있는 경우
- 타입에 값이 있으면 옵셔널 리턴 타입으로 반환 (원래 리턴형이 옵셔널이 아니더라도)
- 타입에 값이 없으면 nil
var bori: Dog? = Dog(name: "보리", weight: 20)
bori.sit() -> x
bori?.sit() -> o
if let b = bori {
b.sit()
b.layDown()
}
bori = nil
bori?.layDown