Swift에서 Optional이란?
wrapped value 또는 값의 부재를 나타낼 때 Optional 형식을 사용한다.
여기서 말하는 값의 부재는 메모리 할당하지 않은 것을 의미한다.
일반적으로 변수의 유형을 Int? 와 같이 물음표를 타입 이름의 후행에 표시한다.
Optional<Int>는 또 다른 작성 방식입니다.
여기서 나오는 Optional.none 은 nil 과 동일합니다.
let number: Int? = Optional.som(42)
let noNumber = Int? = Optional.none
옵셔널 바인딩과 강제 언래핑의 차이점
두 가지 모두 Optional을 언래핑할 때, 조건적으로 할 것인지 강제로 할 것인지의 차이가 있다.Optional Binding
은 Optional 인스턴스의 래핑된 값을 새 변수에 조건부로 바인딩하는 것을 의미한다.
아래의 제어 구조 중 하나를 사용하면 된다.
- if let
- guard let
- switch
Unconditional Unwrapping
은 값이 포함되어 있다고 확신하는 경우 forced unwrap operator
접미사 ! 를 사용하여 래핑을 해제할 수 있다. nil 인스턴스를 Unconditional Unwrapping
하면 런타임 오류가 발생한다.
옵셔널 체이닝의 동작 원리
Optional Chaining
은 인스턴스의 속성과 메서드에 접근하기 위해 접미사 ? 를 사용하여 연결한다.
첫 번째 옵셔널 값을 확인하고 nil인지 확인하고 nil 인 경우, 다음 단계로 진행하지 않고 종료한다.
암시적 언래핑 옵셔널의 사용
반드시 존재한다고 확신할 때 사용한다.
특히 Storyboard나 XIB 파일에서 UI 요소를 코드에 연결할 때 자주 사용된다.
@IBOutlet var button: UIButton!
암시적 언래핑 옵셔널을 사용하기 전에 항상 값이 할당되었는지 확인해야 한다.
값 존재 여부를 확인하는 과정이 없기 때문에 성능이 더 향상될 수 있다.
nil 병합 연산자 ??의 사용
?? 연산자를 사용하여 인스턴스가 nil인 경우 기본값을 제공한다.
또한, 여러 ?? 연산자를 사용하여 연결할 수도 있다.
let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"
오류 발생 가능성을 줄이거나 nil인지 확인하지 않고 바로 값을 사용하고 싶을 때 사용한다.