Swift 기초문법

Swift: 옵셔널체이닝

zoonee 2022. 3. 19. 17:03

 

 

옵셔널체이닝
  • 옵셔널에 속해 있는 nil일지도 모르는 프로퍼티, 메소드, 서브스크립션등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정
  • 옵셔널에 값이 있다면 프로퍼티, 메소드등을 호출할 수 있고, 옵셔널이 nil이라면 프로퍼티, 메소드 등은 nil을 반환한다.

 

Developer라는 구조체를 정의해보자. 구조체를 정의하기 위한 struct키워드를 사용하고 Developer라는 네이밍으로 정의하여 구조체를 만들고, 이 블록안에 name이라는 프로퍼티 상수를 선언하였다. 그 다음 Company라는 이름의 구조체를 또 생성하고, name이라는 프로퍼티 상수를 선언하고, developer라는 프로퍼티라는 변수를 선언하여 옵셔널타입을 갖게 선언한다. 그리고 Company라는 구조체의 인스턴스도 생성해준다. 그 후 company변수를 선언해주고, 다음에 Company 인스턴스를 생성하여 name은 "Gunter"를 developer에는 nil을 넘겨주도록 하였다. company인스턴스 developer 프로퍼티에 뭐가 들어있는지 print함수로 출력해보자. 실행해보면 nil이 출력되는걸 확인할 수 있다.

 

그러면 nil 부분이 값이 생긴다고 가정을 해보자.

developer라는 변수를 선언해주고, Developer 인스턴스를 생성하는데 매개변수 name에 "han"이라는 이름을 넘겨주자. 그리고, Company인스턴스 developer생성자 매개변수에 nil이 아니고 developer 변수의 이름을 집어넣어 실행해보자. 그러면 옵셔널에 감싸진 Developer인스턴스가 출력되는걸 확인할 수 있다. 당연하게도 Developer프로퍼티는 옵셔널타입이 옵셔널로 감싸져 있는데 Developer인스턴스가 출력된다. 그러면 developer 인스턴스 안에 있는 메인프로퍼티에 접근하여 이름을 출력해보자.

 

 

print함수를 적어주고, company.developer.name으로 이름이 출력되게 하면 에러가 발생한다. 에러메세지를 보면 developer타입에 namename프로퍼티에 접근하기 전에 developer타입의 옵셔널이 언랩핑 되어야 된다는 메세지가 나온다. 즉 company.developer는 옵셔널 타입이고 developer는 옵셔널에 감싸져 있어서 developer의 내부 프로퍼티인 네임에 접근하기전에 옵셔널을 벗겨내라는 에러이다. 

 

이전에 배운 옵셔널 바인딩으로 옵셔널값을 접근할 수 있지만 옵셔널체이닝이란걸 사용해서 접근할 수도 있다. 사용방법은 가능하다. 내부의 프로퍼티를 접근하기 전에 느낌표나 물음표를 붙여 사용하면 된다. developer이름뒤에 물음표를 붙여서 출력하도록 해보자.

 

→ ? 와 !를 사용하면 바로 에러메세지가 사라진다. 실행해보면 옵셔널 문자열 한, 옵셔널이 벗겨진 한이 출력되는걸 확인할 수 있다. ? 로 옵셔널체이닝을 하면 접근한 프로퍼티의 값은 항상 옵셔널에 감싸져 있고, 느낌표로 옵셔널체이닝하면 옵셔널프로퍼티를 강제 언래핑 하여 접근하기 때문에 값이 옵셔널로 감싸져 있지 않다. ? 옵셔널체이닝을 통해 접근한 프로퍼티는 값이 nil이 될 수도 있어 옵셔널로 감싸져 있는 값이 출력되는데 만일 옵셔널값을 벗겨내고 싶으면 옵셔널바인딩을 사용하면 된다. 이렇게 인스턴스 옵셔널 프로퍼티에 내부프로퍼티로 접근할 때 옵셔널 바인딩 없이 옵셔널체이닝을 이용하면 값에 쉽게 접근할 수 있다.

'Swift 기초문법' 카테고리의 다른 글

Swift: 클로저(Closure)  (0) 2022.03.19
Swift: try-catch  (0) 2022.03.19
Swift: 열거형(enum, case, rawValue)  (0) 2022.03.19
Swift: 익스텐션(extension)  (0) 2022.03.19
Swift: 프로토콜(protocol)  (0) 2022.03.19