🔥 옵셔널 체이닝과 옵셔널 반환 값

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

위 코드를 자세히 살펴보면:

  1. john.residence는 옵셔널 Residence 인스턴스입니다.
  2. john.residence?.address는 옵셔널 체이닝을 사용하여 john.residence가 존재하는 경우 address 속성에 접근합니다.
  3. john.residence?.address?.buildingIdentifier()address가 존재하는 경우 buildingIdentifier() 메서드를 호출합니다.
  4. 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

위 코드의 동작 방식을 자세히 살펴보면:

  1. buildingIdentifier() 메서드가 반환한 String? 값에 대해 hasPrefix(_:) 메서드를 호출합니다.
  2. hasPrefix(_:) 메서드는 String 타입에 정의되어 있으므로, 옵셔널 체이닝은 buildingIdentifier() 메서드의 반환 값을 자동으로 언래핑합니다.
  3. if let 구문은 hasPrefix(_:) 메서드의 반환 값이 true인 경우에만 beginsWithThe 상수에 true를 할당합니다.
  4. 내부 if 구문은 beginsWithThe 값에 따라 적절한 메시지를 출력합니다.

이렇게 옵셔널 체이닝을 사용하면 깔끔하고 간결한 코드를 작성할 수 있습니다. nil 검사와 언래핑을 명시적으로 수행하지 않아도 되니까요. 메서드의 반환 값이 옵셔널 타입인 경우에도 마찬가지입니다.