값이 있을 수도 있고 없을 수도 있다.
변수의 타입을 설정할때 ?
키워드를 삽입하고, nil
을 할당해준다.
var number:Int? = nil
var name:String? = nil
값이 없는 변수에 접근을 하면 다른 언어에서는 일반적으로 런타임 에러가 발생하지만, swift에서 옵셔널로 설정한 변수에는 접근해도 오류가 발생하지 않는다.
var optionalName: String? = "Daeseong"
print(optionalName) // Optional("Daeseong")
Optional("Daeseong")
-> 이처럼 바로 String이 아니라 Optional이라는 포장지에 둘러쌓인 형태로 나온다. 이 변수를 사용하기 위해서는 옵셔널 바인딩이라는 과정이 필요하다.
옵셔널 해제 연산자 !
를 통해 해결할 수 있다.
var number: Int? = 11
print(number) // Optional(11)
print(number!) // 11
강제해제는 만약 값이 nil인 변수를 강제 해제할 경우 오류가 발생하게 되므로 위험하다.
if문과 guard문을 통해 바인딩 할 수 있다.
var number: Int? = 3
// if 문
if let result = number {
print(result)
} else {
// 값 추출이 실패할 경우
} // 3
// guard 문
func test() {
let number: Int? = 5
guard let result = number else { return }
print(result)
}
test() // 5
비교연산자를 이용해서 다른 값이랑 비교하면 컴파일러가 자동으로 해제하게 된다.
let value : Int? = 10
if value == 10 {
print("value는 10이다")
} else {
print("Nah..")
}
let string = "12"
var stringToInt: Int! = Int(string)
print(stringToInt) // Optional(12)
print(stringToInt + 1) // 13
// ? Case...
let string = "12"
var stringToInt: Int? = Int(string)
print(stringToInt)
print(stringToInt + 1) // Error : Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
// 해제가 안되는 것을 볼 수 있다.
string을 Int화시킬 때 string이 숫자가 아닌 경우
nil이 되기 때문에 Optional로 타입을 지정할 필요가 있음
이때 옵셔널 ?
대신 !
을 사용하면 옵셔널을 묵시적으로 해제한 상태로 사용할 수 있음.