🔥 여러 단계의 옵셔널 체이닝 연결하기

326자
5분

Swift에서는 여러 단계의 옵셔널 체이닝을 연결하여 모델 내부의 속성, 메서드 및 서브스크립트에 더 깊이 접근할 수 있습니다. 그러나 여러 단계의 옵셔널 체이닝이 반환된 값에 더 많은 옵셔널 수준을 추가하지는 않아요.

다른 말로 설명하자면:

  • 옵셔널 체이닝을 통해 검색하려는 유형이 옵셔널이 아닌 경우, 옵셔널 체이닝으로 인해 옵셔널이 됩니다.
  • 검색하려는 유형이 이미 옵셔널인 경우, 체이닝으로 인해 더 많은 옵셔널이 되지는 않습니다.

따라서:

  • 옵셔널 체이닝을 통해 Int 값을 검색하려고 하면, 사용된 체이닝 단계에 관계없이 항상 Int?가 반환됩니다.
  • 마찬가지로, 옵셔널 체이닝을 통해 Int? 값을 검색하려고 하면, 사용된 체이닝 단계에 관계없이 항상 Int?가 반환됩니다.

아래 예제는 johnresidence 속성의 address 속성의 street 속성에 접근하려고 합니다. 여기서는 옵셔널 유형인 residenceaddress 속성을 통해 체이닝하기 위해 두 단계의 옵셔널 체이닝이 사용되고 있어요.

if let johnsStreet = john.residence?.address?.street {
    print("John's street name is \(johnsStreet).")
} else {
    print("Unable to retrieve the address.")
}
// "Unable to retrieve the address."를 출력합니다.
swift

현재 john.residence의 값에는 유효한 Residence 인스턴스가 포함되어 있습니다. 그러나 john.residence.address의 값은 현재 nil이에요. 이로 인해 john.residence?.address?.street 호출이 실패하게 됩니다.

위의 예제에서는 street 속성의 값을 검색하려고 한다는 점에 주목하세요. 이 속성의 유형은 String?입니다. 따라서 john.residence?.address?.street의 반환 값도 속성의 기본 옵셔널 유형에 더하여 두 단계의 옵셔널 체이닝이 적용되더라도 String?입니다.

만약 john.residence.address의 값으로 실제 Address 인스턴스를 설정하고, 주소의 street 속성에 실제 값을 설정한다면, 다단계 옵셔널 체이닝을 통해 street 속성의 값에 접근할 수 있습니다.

let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence?.address = johnsAddress
 
if let johnsStreet = john.residence?.address?.street {
    print("John's street name is \(johnsStreet).")
} else {
    print("Unable to retrieve the address.")
}
// "John's street name is Laurel Street."를 출력합니다.
swift

이 예제에서 john.residenceaddress 속성을 설정하려는 시도는 성공할 것입니다. 왜냐하면 현재 john.residence의 값에 유효한 Residence 인스턴스가 포함되어 있기 때문이죠.

이렇게 Swift에서는 여러 단계의 옵셔널 체이닝을 연결하여 모델의 깊은 곳까지 접근할 수 있습니다. 하지만 옵셔널 체이닝의 단계 수와 관계없이 검색하려는 값의 옵셔널 수준은 변하지 않는다는 점을 기억하는 것이 중요해요.

옵셔널 체이닝을 적절히 활용하면 코드의 안전성을 높이면서도 깊이 중첩된 속성에 편리하게 접근할 수 있습니다.