값이 있을 수도 있고 없을 수도 있음
(여기서 값이 없다는 것은 nil을 의미함)
// 타입 뒤에 "?"를 넣어 선언하면, 옵셔널 변수
var optionalName: String?
optionalName = "juh2"
optionalName = nil
옵셔널 변수 뒤에 "!"를 붙여 옵셔널의 값을 추출합니다.
var optionalNumber: Int? = 3
print(optionalNumber) // Optional(3)
// 옵셔널 강제 해제
print(optionalNumber!) // 3
// 옵셔널 변수의 값이 nil인 경우 런타임오류 발생
optionalNumber = nil
print(optionalNumber!) // ❌ 런타임 오류
if let number: Int = optionalNumber {
// 값이 추출되면 실행되는 구문
print(number) // 3
else {
// 값 추출에 실패하면 실행되는 구문
}
guard let number: Int = optionalNumber else { return }
print(number) // 3
옵셔널을 비교연산자로 다른 변수과 비교하면, 컴파일러가 자동으로 옵셔널 값을 해지함
let value: Int? = 6
if value == 6 {
print("value가 6입니다.")
}else {
print("value가 6이 아닙니다.")
}
// "value가 6입니다."
옵셔널이지만 값을 사용할때는 자동으로 옵셔널이 해지됨
let string = "12"
var stringToInt: Int? = Int(string)
print(stringToInt) // Optional(12)
print(stringToInt + 1) // 🚫옵셔널 해지하라고 에러남
// 묵시적 옵셔널 해제
//타입 뒤에 !이 붙으면 사용할때 옵셔널이 해제됨
var stringToInt: Int! = Int(string)
print(stringToInt + 1) // 13
let string: String = "aa"
var stringToInt: Int! = Int(string)
print(stringToInt + 1) // 🚫에러남!