Swift 는 다른 언어와 다르게 Optional 이라는 타입으로 nil 을 처리 합니다. ( nil == Null )
일반 변수에 nil 값은 대입이 불가하고 nil 사용이 필요할 때 Optional 타입을 사용합니다.
내부 구현은 Enum (열거형) 으로 이루어져 있고, 값이 없는 none 케이스와 값이 존재하는
some 케이스를 가지고 있습니다
* <Wrapped> 은 Generic 이다.
* @frozen 어노테이션은 Swift 4.2 에 추가된 기능으로 Enum Type 에 더이상 추가될 Case
가 존재하지 않음을 명시해준다. ( Default Case 필요 X, 컴파일 속도 향상 )
Optional 선언
선언은 다음과 같습니다. Optional<Type> 으로 선언하고 값이 존재한다면 some
존재하지 않다면 none 케이스를 대입합니다.
가장 일반적으로 많이 사용하는 방법은 "?" 키워드를 사용하는 것입니다.
Type 뒤에 "?" 를 붙여주면 위와 같은 긴 타입 이름을 줄일 수 있습니다.
추가적으로 값이 있음을 확신할 때 "!" 키워드를 사용 할 수 있습니다. ( 암시적 추출 옵셔널 )
옵셔널이지만, 일반 타입처럼 사용할 수 있습니다. ( @IBOutlet 에 주로 사용 )
Optional 사용
Optional 은 enum 타입이기 때문에 Switch 구문으로 값을 가져올 수 있습니다.
하지만 불필요하게 코드가 증가하기 때문에 다음과 같은 방법을 사용합니다.
Forced Unwrapping
"!" 키워드를 사용하여 강제로 Unwrapping 합니다. 값이 존재함을 확신할 때
사용하는 것을 권장합니다. 만약 nil 값이 대입되어 있다면 런타임 에러가 발생합니다.
Optional Binding
if let 혹은 guard let 구문으로 Unwrapping 하는 방식을 말합니다.
값이 존재하냐, 하지 않느냐에 따라서 if else 를 통과합니다.
메소드 초반부에 guard 를 사용하면 코드 Depth 를 줄일 수 있습니다.
Optional Chaining
옵셔널이 nil이 아니라면 해당하는 프로퍼티, 메소드, 서브스크립트를 호출하는 방식을 의미 합니다.
"?" 키워드를 통해 Chaining 하여 구성하고, 중간에 nil 값이 발견되면 호출을 중단합니다.
강제 언래핑 방식과 다르게 런타임 에러를 발생시키지 않습니다.
또한 Optional Binding 과 같이 사용하면 코드 Depth 를 줄일 수 있습니다.
nil coalescing
왼쪽 값이 nil 이라면 오른쪽을 반환하는 연산자입니다. 특정 변수에 값을 대입해야 하는 경우
유용하게 사용할 수 있습니다.
'iOS Dev > Swift' 카테고리의 다른 글
iOS JSON 을 Decoding 하는 여러 가지 방식들 (0) | 2021.08.26 |
---|---|
지금까지 받았던 코드 리뷰 정리 ( iOS, Swift ) (0) | 2020.11.10 |
Swift ARC ( Automatic Reference Counting ) 정리 (2) | 2020.10.07 |
윈도우 10 에서 Swift 5 사용하기 ( Visual Code, WSL ) (4) | 2020.08.01 |
iOS "UITableView Section Header 로드되지 않는 문제" 해결 (0) | 2020.07.26 |