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

326자
5분

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

다른 말로 설명하자면:

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

따라서:

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

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

swift
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
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."를 출력합니다.

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

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

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

swift
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
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."를 출력합니다.

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

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

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

YouTube 영상

채널 보기
존 매카시가 들려주는 인공지능의 탄생 이야기
커스텀 예외 필터 만들기 | NestJS 가이드
class-validator 와 DTO | NestJS 가이드
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
펑터 합성 | 프로그래머를 위한 카테고리 이론
NestJS 필터 바인딩 - Method, Controller, Global Scope 비교 | NestJS 가이드
Git Worktree로 여러 피처 동시에 개발하기 | AI 코딩 시대의 필수 스킬
NestJS 파이프가 뭔가요? 컨트롤러를 보호하는 방법 | NestJS 가이드