들어가기에 앞서 올셔널의 개념이 처음이라면 옵셔널에 대해서(링크) 미리 공부하고 보는것을 추천한다.
옵셔널 체이닝이란 옵셔널 데이터에 접근하는 방법중 하나이다.
특히나 중첩된 옵셔널 프로퍼티를 접근해야 하는 경우 코드가 굉장히 복잡해 질 수 있는데 옵셔널 체이닝을 이를 해결해준다.
class Person {
var home: Home?
}
class Home {
var room: Room?
}
class Room {
var number: Int?
}
var john = Person()
예를 들어 위 소스코드 처럼 옵셔널 저장 프로퍼티 인데 여러 타입의 중첩 인스턴스 라면 john인스턴스가 Room의 number프로퍼티에 접근하려면 코드는 다음과 같이 사용해야 될 것이다.
if let home = john.home {
if let room = home.room {
if let number = room.number {
print("Room number is \(number)")
} else {
print("Room number is not available")
}
} else {
print("Room is not available")
}
} else {
print("Home is not available")
}
if-let을 3중으로 하거나 ??연산자를 3중으로 해야 할것이다. 프로퍼티 하나 접근하기에는 코드가 너무 복잡해진다 그렇다고 !를 이용한 강제 언래핑을 하면 코드는 짧아 질 수 있겠으나 런타임에러 발생위험 때문에 별로 추천되는 방법은 아니다.
이를 해결하기 위해서 스위프트에서는 옵셔널 체이닝이라는 것을 제공한다
아래 코드를 보자
if let roomNumber = john.home?.room?.number {
print("Room number is \(roomNumber)")
} else {
print("Room number is not available")
}
Room number is not available
위 중첩 옵셔널 바인딩과 동일한 기능인데 코드가 아주 간단하게 옵셔널 데이터에 접근이 가능하다.
이처럼 옵셔널 체이닝은 옵셔널인 데이터를 접근하는데 사용되며 만약 그 데이터가 nil인 경우 nil을 반환한다.
var perfect_john = Person()
perfect_john.home = Home()
perfect_john.home?.room = Room()
perfect_john.home?.room?.number = 100
john = perfect_john
if let roomNumber = john.home?.room?.number {
print("Room number is \(roomNumber)")
} else {
print("Room number is not available")
}
Room number is 100
이 코드의 옵셔널 체이닝한 프로퍼티의 값을 저장하는 방식을 보자.
만약 위 코드에서 room number를 저장해놓고 사용하고 싶다면 어떻게 해야 할까?
정석적으로 그냥 각 인스턴스가 nil이 아닌 실제 인스턴스가 들어가게 만들어 주면 된다.
중첩된 옵셔널 데이터에 편리하고 직관적으로 접근하기 위해서 옵셔널체이닝이라는 것을 할 수 있다.