Swift문서에서 볼 수 있듯이 Swift는 안전한 코딩을 위한 언어라고 한다.
그렇다면 안정성에 기본이 되는 Optional에 대해 한 번 알아보자
Optional에 대해 알아보기 위해 공식문서를 한 번 살펴보자.
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
var number: Int?
옵셔널은 위 코드처럼 선언할 수 있으나 shortForm처럼 단축된 양식을 쓰는게 가독성면에서 좋다고 한다.
Optional 타입은 두가지이다. 값이 있거나 없거나(nil)
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"
그렇다면 Optional의 값이 있을 경우 어떻게 가져올까?
문서에는 네 가지 방법이 있다고 한다.
아래 코드를 이용하여 옵셔널 값들을 꺼내보자
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
Dictionary의 키를 이용하여 값을 꺼내올 때는 optional Value가 반환되기 때문에 imagePaths["star]은 String? 타입이다.
Optional Binding은 if let, guard let, and switch처럼조건문을 이용하여 값을 꺼낼 수 있다!
if let starPath = imagePaths["star"] {
print("The star image is at '\(starPath)'")
} else {
print("Couldn't find the star image")
}
// Prints "The star image is at '/glyphs/star.png'"
래핑(?)된 인스턴스의 메소드와 프로퍼티들에 안전하게 접근하려면 옵셔널 연산자 postfix를 사용하자. 아래 코드는 String? 인스턴스에hasSuffix를 통해 옵셔널 체이닝을 사용하는 예제이다.
if imagePaths["star"]?.hasSuffix(".png") == true {
print("The star image is in PNG format")
}
// Prints "The star image is in PNG format"
nil-calenescing 연산자(??)를 사용하여 옵셔널의 기본값이 nil인 경우 기본값을 제공하여 나타낸다. 이 예시에서 기본 값은 String타입의 이미지 경로를 나타냈다.
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"
그리고 ?? 연산자는 여러번 적어 나타낼 수 도 있다.
let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"
만약 Optional에 값이 들어있다고 확신할 수 있는경우
let number = Int("42")!
print(number)
// Prints "42"
!를 사용하여 값을 강제로 꺼낼 수 있다.
하지만 Optional의 값이 nil일 때 강제언래핑(!)을 할 경우 런타임 에러가 생기기 때문에 되도록이면 위 3가지 방법을 이용하여 Optional의 값을 꺼내는 것이 좋다.