본문 바로가기
IOS App Programming/Swift

[Swift] 옵셔널 체이닝과 nil 병합 연산자

by B_Tori 2023. 3. 31.

옵셔널 체이닝

옵셔널 체이닝이란?

nil일수도 있는 옵셔널 프로퍼티, 메서드, 서브스크립트 등을 가져오거나 호출하는 과정이다.

값이 있으면 접근을 허용하여 성공적으로 호출이 되고, 값이 없으면 nil을 반환한다.

호출하고 싶은 옵셔널에?를 붙여 표현하면 사용할 수 있다.

 

특징

  • 옵셔널 체이닝의 마지막 표현식은 값이 옵셔널이든 아니던?를 생략한다.
    ex) A?.B? 는 안되고 A?. B로 표현해야 함
  • 중첩된 옵셔널 중 1개라도 값이 존재하지 않으면(nil을 가지면) 결과적으로 nil을 반환한다.
    그리고 nil을 반환한 옵셔널 뒤의 표현식들은 평가되지 않는다.
    ex) A?. B?. C?. D일 때 B가 값을 가지고 있지 않아 nil을 반환한다면 B뒤의 표현식인 C와 D는 평가되지 않고 B에서 평가를 멈추고 nil을 반환한다.
  • 옵셔널 체이닝의 반환값은 마지막 표현식의 타입의 옵셔널을 랩핑 한 타입이다.
    즉 마지막 표현식의 반환값이 Int라면 옵셔널 체이닝의 반환값은 Optional <Int>가 된다.
    -> 옵셔널 체이닝 과정에서 nil이 반환될 수 있기 때문에 옵셔널로 랩핑 된다.

강제 추출(!)과의 차이점

강제 추출과 옵셔널 체이닝은 비슷한 동작을 하지만 !는 강제 추출이므로 옵셔널의 값이 nil이라면 런타임 오류가 발생한다.

29번과 35번 라인을 보면 옵셔널 체이닝의 모습을 볼 수 있다.

  1. tori라는 변수는 옵셔널 변수이므로 tori라는 변수가 있다면 tori변수의 home에 접근한다.
  2. home 프로퍼티 또한 옵셔널이므로 tori 변수 안에 home 프로퍼티에 값이 있는지 확인한다.
  3. home이라는 프로퍼티에 값이 있다면 home의 owner 프로퍼티에 접근한다.
  4. owner프로퍼티 또한 옵셔널이므로 값이 존재하는지 확인한다.
  5. owner에 값이 있다면 job에 접근한다.
  6. job의 값이 있다면 job의 값을 반환한다.

29번 라인의 경우 1번 tori변수는 있으므로 2번을 평가하는데 tori변수에는 name정보만 있을 뿐 아직 job정보와 home정보를 가지고 있지 않기 때문에 nil을 반환한다. 2번 이후의 평가는 모두 생략된다.

하지만 정보를 모두 할당해 준 뒤 출력한 35번의 모습을 보면

1-6 과정 동안 모두 값이 존재하기 때문에 "개발자"라는 정보를 출력한다.

 

 

딕셔너리와 옵셔널 체이닝

딕셔너리에서도 옵셔널 체이닝을 만날 수 있다.

단순히 딕셔너리 변수를 옵셔널로 선언했을 때뿐만 아니라 딕셔너리 특성에 의해 옵셔널 체이닝을 해야 하는 경우가 있다.

예를 들어 let dic:[String:String] = ["name":"Tori"]와 같은 딕셔너리 변수가 있다고 가정한다.

이때 key를 통해 value에 접근해서 value의 속성을 사용하고자 할 때 옵셔널 체이닝을 사용한다.

딕셔너리 특성상 key를 통해 value를 얻을 땐 key가 있을 수도 있고, 없을 수도 있기 때문이다.

따라서 key를 통해 얻은 value문자열의 count속성을 이용하고자 할 땐

dic["name"]?.count 와 같이 사용해야 한다.

 

그리고 추가적으로 let dic?:[String:String] = ["name":"Tori"]처럼 딕셔너리 변수 자체가 옵셔널인 경우

dic?["name"]?.count 와 같이 ?[]? 형태로 사용한다.

 

nil 병합 연산자

옵셔널과 밀접한 관련을 가진 nil 병합 연산자이다.

우선 사용 방법은 아래와 같다.

변수 = 옵셔널 ?? 값

이는 앞의 옵셔널이 nil이라면 ?? 뒤의 값을 변수에 할당하는 것을 의미한다.

댓글