옵셔널은 제네릭이 적용된 열거형으로 구현되어 있음
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
// ...
}
열거형의 some 케이스로 래핑되어 있는 옵셔널의 값을 옵셔널이 아닌 값으로 추출하는 것
중첩된 값을 호출하기 위해 옵셔널을 중첩된 형태(체인)로 사용하는 것
let roomNumber: Int? = person.address?.building?.room?.number
if let roomNumber = person.address?.building?.room?.number {
print(roomNumber)
} else {
print("Can not find room number"
}
// 만약 빌딩에 대한 값이 없었다면, 체인의 위치와 관계없이 값을 넣어주면 바인딩에 값이 들어온다.
person.address?.building = Building(name: "SongWon")
if let roomNumber = person.address?.building?.room?.number {
print("roomNumber : \(roomNumber)")
} else {
print("Can not find room number"
}
// roomNumber : 404
func fetchFullAdress() -> String? { }
func navigateToPlace() { }
person.address?.navigateToPlace()
person.address?.fetchFullAdress()?.isEmpty
let optionalArray: [Int]? = [1, 2, 3]
optionalArray?[1] // 2
let optionalDictionary: [String:[Int]]? = [String:[Int]]()
optionalDictionary?["numberArray"] = optionalArray
// 딕셔너리의 value의 타입은 [Int]이지만 [Int]?를 넣어줬다. 그래서 ? 을 붙인다.
optionalDictionary?["numberArray"]?[2] = 3