Swift 정리 - Optional Chaining

김세영·2022년 3월 17일
0

Swift Doc 정리

목록 보기
15/17
post-thumbnail

nil일 수도 있는 프로퍼티나 메서드, 서브크립트에 질의(Query)를 하는 과정

  • 옵셔널이 값을 갖고 있다면 값을 반환
  • nil이라면 nil을 반환
  • 질의를 연결했을 때, 어느 하나라도 nil일 경우 전체 결과는 nil
import Foundation

struct SomeOptionalStruct {
  var someOptionalProperty: Int?
}

class SomeOptionalClass {
  var someOptionalStruct: SomeOptionalStruct?
  
  init() {
    someOptionalStruct = SomeOptionalStruct()
  }
}

let someOptionalClass: SomeOptionalClass? = SomeOptionalClass()
print(someOptionalClass?.someOptionalStruct?.someOptionalProperty)
// nil
someOptionalClass?.someOptionalStruct?.someOptionalProperty = 3
print(someOptionalClass?.someOptionalStruct?.someOptionalProperty)
// Optional(3)

Objective-C의 nil 메시징

옵셔널 체이닝은 Objective-C의 nil 메시징과 유사

  • 차이점
    • reference type 뿐만 아니라 primitive type에서도 사용 가능
    • 값을 가져올 때, 성공 및 실패 여부 확인 가능

Optional Chaining as an Alternative to Forced Unwrapping

옵셔널 체이닝은 옵셔널 값 뒤에 ?를 붙여서 표현
강제 언래핑은 옵셔널 값 뒤에 !를 붙여서 표현

옵셔널 체이닝강제 언래핑
nil값 호출 시nil값 반환런타임 에러 발생
반환 타입옵셔녈옵셔널이 아닌 타입 자체

옵셔널 체이닝은 호출 시 런타임 에러가 발생하지 않기 때문에 안정적이지만
옵셔널 언래핑이 필요한 상황이라면 코드가 다소 길어질 수 있다.


Accessing Through Optional Chaining

if let 혹은 guard let 구문으로 옵셔널 언래핑을 진행하고, 값을 가져오는데에 성공했는지 실패했는지 알 수 있다.

  • if let
if let value = someClass?.someProperty {
    print(value)
} else {
    print("value is nil")
}
  • guard let
guard let value = someClass?.someProperty else {
    print("value is nil")
    return // 메서드 내부에 있다고 가정
}
print(value)
  • 메서드 호출 시, 리턴값이 없는 경우 암시적으로 Void를 반환
    따라서 옵셔널 체이닝에 리턴값이 없는 메서드가 호출되면 Void?를 반환
    • 이 때 if문 등으로 값이 nil인지 확인하여 값을 가져오는 데에 성공하였는지 판단 가능

Linking Multiple Levels of Chaining

여러 단계에 걸쳐 옵셔널 체이닝을 연결 가능

  • 체이닝의 상위 레벨이 옵셔널인 경우 현재 값이 옵셔널이 아니더라도 옵셔널이 된다.
  • 상위 레벨과 현재 레벨이 모두 옵셔널이라고 해서 더 옵셔널해지지는 않는다.
    Optinal(Optinal(Optional(..))) X
  • 옵셔널 체이닝을 사용하면 반환값은 무조건 옵셔널이다.
  • 옵셔널을 반환하는 메서드가 체이닝에 물려 있을 경우 다음과 같이 사용한다.
    someClass?.someMethodA()?.someMethodB()?. ...
profile
초보 iOS 개발자입니다ㅏ

0개의 댓글