→ 변수/상수 등에 꼭 값이 있다는 것을 보장할 수 없다. 값이 nil일 수도 있다.
** 옵셔널 변수/상수가 아니면 nil 값 할당 불가능. 즉 옵셔널 (? 추가) 이어야지만 nil 값 할당 가능
var myName : String? = "kevin"
myName = nil
print(myName)
//nil
함수 매개변수가 옵셔널일 때는 "아, 이 매개변수에는 값이 없어도 되는구나"라는 것을 바로 알아야 함
옵셔널은 값을 갖는 케이스와 그렇지 못한 케이스 두 가지로 정의되어 있음 (enum)
→ nil 일때는 none case, 값이 있으면 some case.
→ 옵셔널에 값이 있으면 some 과 연관된 값인 Wrapped 에 값이 할당된다
강제 추출:
var myName: String? = "kevin"
//옵셔널이 아닌 변수에는 옵셔널 값이 들어갈 수 없음. 추출해서 할당해야 함
var name: String = myName!
myName = nil
name = myName!
//오류
if myName!=nil{
print("name is \(myName!)")
}else{
print("name == nil")
}
옵셔널 바인딩:
var myName: String? = "yagom"
// 옵셔널 바인딩을 통한 임시 상수 할당
if let name = myName{
print("name is \(name)")
}
else{
print("nil")
}
//name is yagom
// 옵셔널 바인딩을 통한 임시 변수 할당
if var name = myName{
name = "kevin"
print("my name is \(name)")
}
else{
print("nil")
}
//my name is kevin
→ name 은 임시 상수/변수임. 코드 블록 외부에서 사용 불가능
여러 개의 옵셔널 값 추출 시:
var myName: String? = "yagom"
var yourName: String? = nil
if let name = myName, let friend = yourName{
print("\(name), \(friend)")
}
//friend 에 바인딩이 되지 않으므로 오류
yourName = "eric"
if let name = myName, let friend = yourName{
print("\(name), \(friend)")
}
//yagom eric
암시적 추출 옵셔널
var myName: String! = "yagom"
print(myName)
//yagom
myName = nil
if let name = myName{
print("\(name)")
}else{
print("nil")
}
→ 추천하는 방법은 아님