Swift 옵셔널 데이터 타입은 대부분의 다른 프로그래밍 언어에 없는 새로운 개념이다.
옵셔널 타입의 목적은 변수 또는 상수에 값이 할당되지 않은 상황을 처리하기 위해 안전하고 일관된 접근 방식을 제공하는 것이다.
변수를 선언할 때, 데이터 타입 선언 다음에 '?' 문자를 넣어 두어 옵셔널이 되게 한다.
var index: Int?
이제 index 변수는 정숫값이 할당되거나 아무런 값도 할당되지 않을 수 있다.
내부적으로 컴파일러와 런타임의 관점에서 볼 때 어떤 값도 할당되지 않은 옵셔널은 실제로 nil의 값을 갖는다.
옵셔널은 할당된 값이 있는지를 식별하기 위한 테스트를 다음과 같이 쉽게 할 수 있다.
var index: Int?
if index != nil {
// index 변수는 값이 할당되어 있다.
} else {
// index 변수는 값이 할당되어 있지 않다.
}
만약 옵셔널에 값이 할당되었다면 해당 값이 옵셔널 내에서 '래핑되었다(wrapped)'고 말한다.
옵셔널 안에 래핑된 값을 사용할 때는 강제 언래핑(forced unwrapping)이라는 개념을 이용하게 된다.
래핑된 값은 옵셔널 데이터 타입에서 옵셔널 이름 뒤에 느낌표( ! )를 두어 추출되게 한다.
var index: Int?
index = 3
var treeArray = ["Oak", "Pine, "Yew", "Birch"]
if index != nil {
print(treeArray[index!])
} else {
print("index does not contain a value")
}
옵셔널로 할당된 값을 강제언래핑하지 않고 직접 접근한다면 에러가 생긴다.
강제 언래핑 대신, 옵셔널로 할당된 값은 옵셔널 바인딩을(Optional binding)이용하여 임시 변수나 상수에 할당할 수 있다.
if let constantName = optionalName {
}
if var variableName = optionalName {
}
다음의 코드는 두 가지 작업을 수행한다.
지정된 옵셔널이 값을 가지고 있는지를 확인한다.
옵셔널 변수가 값을 가지고 있는 경우에 선언된 상수 또는 변수에 그 값을 할당하고 코드가 실행된다.
var index: Int?
index = 3
var treeArray = ["Oak", "Pine, "Yew", "Birch"]
if let myValue = index {
print(treeArray[myValue])
} else {
print("index does not contain a value")
}
위 코드는 index 변수에 할당된 값이 언래핑되어 myValue라는 임시 상수에 할당되어 배열에 대한 인덱스로 사용된다.
임시 상수는 if 구문 안에서만 유효하다.
if let index = index {
print(treeArray[index])
} else {
위의 이유로 옵셔널로 할당된 동일한 이름을 사용해도 충돌이 발생하지 않는다.
할당된 값이 없거나 nil을 할당할 수 있는 것은 옵셔널 타입뿐이다.
옵셔널이 아닌 변수 또는 상수에는 nil을 할당할 수 없다.
다음의 코드는 모두 유효하지 않다. (옵셔널로 선언된 변수가 아니다)
var myInt = nil // x
var myString: String = nil // x
let myConstant = nil // x