옵셔널체이닝
- 옵셔널에 속해 있는 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타입에 name에 name프로퍼티에 접근하기 전에 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 |