Optional은 Swift에서 T 유형의 값을 포함하거나 아예 값을 포함하지 않을 수 있는 특별한 유형입니다(nil). T?로 표기됩니다. 변수에 값이 없을 수 있다는 것을 명시적으로 지정할 수 있으며, 컴파일 단계에서 값의 존재를 확인하는 것을 보장합니다.
값 추출 메커니즘:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(값이 nil인 경우 runtime crash를 초래할 수 있음)
let length = str?.count
??):let value = str ?? "default"
String 유형의 변수에 nil을 할당할 수 있나요? 그렇다면 무슨 일이 발생하나요?
응답:
아니요, 일반 유형의 변수(String)에 nil 값을 할당할 수 없습니다. 오직 optional만 nil일 수 있으며, 그렇지 않으면 컴파일 오류가 발생합니다.
예시:
var a: String // a = nil // 컴파일 오류: Nil cannot be assigned to type 'String' var b: String? b = nil // OK
이야기
앱에서 값의 force unwrapping을 시도했을 때 데이터베이스에서 항상 올바른 응답이 온다고 생각하여 필드가 없으면 크래시가 발생했습니다. 이 오류는 optional binding을 통한 추가 검사를 통해 해결되었습니다.
이야기
푸시 알림을 보낼 때 사용자 이름이 non-optional 변수에 저장되어 API에서 빈 이름이 올 경우 애플리케이션이 크래시되었습니다. 분석 후 유형을 optional로 변경하고 nil 처리를 추가했습니다.
이야기
프로젝트에서 optional 값을 함수에 전달할 때 인수가 optional 유형 없이 선언되었습니다. 숨겨진 버그와 크래시가 발생했습니다. 변경을 통해 매개변수 유형이 optional로 바뀌고 값 존재를 확인하는 검사가 추가되었습니다.