🔥 여러 단계의 옵셔널 체이닝 연결하기
Swift에서는 여러 단계의 옵셔널 체이닝을 연결하여 모델 내부의 속성, 메서드 및 서브스크립트에 더 깊이 접근할 수 있습니다. 그러나 여러 단계의 옵셔널 체이닝이 반환된 값에 더 많은 옵셔널 수준을 추가하지는 않아요.
다른 말로 설명하자면:
- 옵셔널 체이닝을 통해 검색하려는 유형이 옵셔널이 아닌 경우, 옵셔널 체이닝으로 인해 옵셔널이 됩니다.
- 검색하려는 유형이 이미 옵셔널인 경우, 체이닝으로 인해 더 많은 옵셔널이 되지는 않습니다.
따라서:
- 옵셔널 체이닝을 통해
Int
값을 검색하려고 하면, 사용된 체이닝 단계에 관계없이 항상Int?
가 반환됩니다. - 마찬가지로, 옵셔널 체이닝을 통해
Int?
값을 검색하려고 하면, 사용된 체이닝 단계에 관계없이 항상Int?
가 반환됩니다.
아래 예제는 john
의 residence
속성의 address
속성의 street
속성에 접근하려고 합니다. 여기서는 옵셔널 유형인 residence
와 address
속성을 통해 체이닝하기 위해 두 단계의 옵셔널 체이닝이 사용되고 있어요.
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.residence
의 address
속성을 설정하려는 시도는 성공할 것입니다. 왜냐하면 현재 john.residence
의 값에 유효한 Residence
인스턴스가 포함되어 있기 때문이죠.
이렇게 Swift에서는 여러 단계의 옵셔널 체이닝을 연결하여 모델의 깊은 곳까지 접근할 수 있습니다. 하지만 옵셔널 체이닝의 단계 수와 관계없이 검색하려는 값의 옵셔널 수준은 변하지 않는다는 점을 기억하는 것이 중요해요.
옵셔널 체이닝을 적절히 활용하면 코드의 안전성을 높이면서도 깊이 중첩된 속성에 편리하게 접근할 수 있습니다.