옵셔널은 지정된 타입에 값이 없을 가능성이 있을 경우에 사용하게 됩니다.
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// The type of convertedNumber is "optional Int"
예제의 convertedNumber는 Int가 되지 못할 가능성도 가지고 있기 때문에
type이 Optional Int가 됩니다.
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
Optional type을 선언할때는 타입 뒤에 ?를 붙입니다.
옵셔널에서 값이 없는 상태를 나타내는 "값"입니다.
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
예시와 같이 옵셔널 타입에서 따로 값을 지정해주지 않게되면 nil값을 가집니다.
옵셔널 바인딩 (optional binding) 은 옵셔널이 값을 포함하고 있는지 확인하고 값이 있는 경우 해당 값을 임시 상수 또는 변수로 사용할 수 있게 해줍니다.
if let <#constantName#> = <#someOptional#> {
<#statements#>
}
guard let <#constantName#> = <#someOptional#> else { <#statements#> ]
if 구문에서 옵셔널 바인딩으로 생성된 상수와 변수는 if 구문의 본문내에서만 사용 가능합니다. 반대로 guard 구문에서 생성된 상수와 변수는 guard 구문 다음에 코드에서 사용 가능합니다.
while let <#constantName#> = <#someOptional#> {
<#statements#>
]
옵셔널 타입을 처리하는 다른 방법은 nil-결합 연산자 (??) 사용하여 기본값을 제공하는 방법입니다. 옵셔널에서 ?? 의 왼편이 nil 이 아니면, 값은 언래핑되고 사용됩니다. 그렇지 않으면 ?? 의 오른편에 값이 사용됩니다.
let name: String? = nil
let greeting = "Hello, " + (name ?? "friend") + "!"
print(greeting)
// Prints "Hello, friend!"
프로그래머의 에러 또는 원치않는 상태와 같은 실패를 nil 로 표현하려면 옵셔널의 이름 뒤에 느낌표 (!) 를 추가하여 접근할 수 있습니다. 이것을 옵셔널의 값의 강제 언래핑 (force unwrapping) 이라고 합니다. nil 이 아닌 값에 강제 언래핑을 하면, 언래핑된 값을 결과로 얻습니다. nil 값을 강제 언래핑하면 런타임 에러가 발생합니다.
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
let number = convertedNumber!
guard let number = convertedNumber else {
fatalError("The number was invalid")
}