옵셔널은 값이 있을 수도, 없을 수도 있음을 나타내는 표현합니다.
값이 없다는 것은 nil로 나타내고 타입에 ?를 추가하면 Optional 타입으로 선언 할 수 있습니다.
var myName: String = "dino"
// error: MyPlayground.playground:2:10: error: 'nil' cannot be assigned to type 'String'
myName = nil
var myName: String? = "dino" // String? 대신 Optional<String>으로 할 수 있음
print(myName) // Optional("dino")
myName = nil
print(myName) // nil
func checkOptionalValue(value optionalValue: Any?){
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \\(value)")
}
}
var myName: String? = "dino"
checkOptionalValue(value: myName) // Value is dino
myName = nil
checkOptionalValue(value: myName) // This Optional variable is nil
간단하지만 런타임 오류가 일어날 가능성이 높기 때문에 위험한 방법
옵셔널 값 뒤에 !를 추가하면 강제로 추출하여 반환
만약 nil이라면 런타임 오류 발생
var myName: String? = "dino"
var dino: String = myName!
myName = nil
dino = myName! // 런타임 오류 발생
옵셔널에 값이 있다면 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당해서 옵셔널이 아닌 값으로 사용할 수 있도록 해주는 기능
if let이라고도 부름
var myName: String? = "dino"
// 옵셔널 바인딩을 통한 임시 상수 할당
if let name = myName {
print("My name is \\(name)")
} else {
print("myName == nil")
}
// My name is dino
var yourName: String? = nil
// ,를 통해 여러개 상수를 선언 할 수 있음
if let name = myName, let friend = yourName {
print("We are friend!")
}
yourName = "eric"
if let name = myName, let friend = yourName {
print("We are friend! \\(name) & \\(friend)")
}
// We are friend! dino & eric
비교연산자를 사용 했을 때 따로 언랩핑 하지 않아도 자동으로 언랩핑으로 계산됨