🔥 옵셔널 체이닝과 옵셔널 반환 값
271자
4분
이전 예제에서는 옵셔널 체이닝을 통해 옵셔널 타입의 속성 값을 검색하는 방법을 보여주었습니다. 그런데 알고 계셨나요? 옵셔널 체이닝을 사용하여 옵셔널 타입의 값을 반환하는 메서드를 호출하고, 필요한 경우 해당 메서드의 반환 값에 대해 체이닝을 수행할 수도 있답니다.
아래 예제를 한번 살펴볼까요? 여기서는 옵셔널 체이닝을 통해 Address 클래스의 buildingIdentifier() 메서드를 호출하고 있습니다. 이 메서드는 String? 타입의 값을 반환하는데요. 위에서 설명한 대로, 옵셔널 체이닝 후 이 메서드 호출의 최종 반환 타입 역시 String?이 됩니다.
if let buildingIdentifier = john.residence?.address?.buildingIdentifier() { print("John's building identifier is \(buildingIdentifier).") } // "John's building identifier is The Larches."가 출력됩니다.swift
위 코드를 자세히 살펴보면:
john.residence는 옵셔널Residence인스턴스입니다.john.residence?.address는 옵셔널 체이닝을 사용하여john.residence가 존재하는 경우address속성에 접근합니다.john.residence?.address?.buildingIdentifier()는address가 존재하는 경우buildingIdentifier()메서드를 호출합니다.if let구문은buildingIdentifier()메서드의 반환 값이nil이 아닌 경우에만buildingIdentifier상수에 값을 할당합니다.
이 메서드의 반환 값에 대해 추가적인 옵셔널 체이닝을 수행하고 싶다면, 메서드의 괄호 뒤에 옵셔널 체이닝 물음표를 배치하면 됩니다.
if let beginsWithThe = john.residence?.address?.buildingIdentifier()?.hasPrefix("The") { if beginsWithThe { print("John's building identifier begins with \\"The\\".") } else { print("John's building identifier doesn't begin with \\"The\\".") } } // "John's building identifier begins with "The"."가 출력됩니다.swift
위 코드의 동작 방식을 자세히 살펴보면:
buildingIdentifier()메서드가 반환한String?값에 대해hasPrefix(_:)메서드를 호출합니다.hasPrefix(_:)메서드는String타입에 정의되어 있으므로, 옵셔널 체이닝은buildingIdentifier()메서드의 반환 값을 자동으로 언래핑합니다.if let구문은hasPrefix(_:)메서드의 반환 값이true인 경우에만beginsWithThe상수에true를 할당합니다.- 내부
if구문은beginsWithThe값에 따라 적절한 메시지를 출력합니다.
이렇게 옵셔널 체이닝을 사용하면 깔끔하고 간결한 코드를 작성할 수 있습니다. nil 검사와 언래핑을 명시적으로 수행하지 않아도 되니까요. 메서드의 반환 값이 옵셔널 타입인 경우에도 마찬가지입니다.