스위프트 프로그래밍 3판을 보고 정리한 내용입니다.
스위프트의 특징 중 하나인 안전성(Safe)을 문법으로 담보하는 기능
Optional은 단어 뜻대로 '선택적인' 즉 값이 있을 수도 있고, 없을 수 도 있음 을 나타내는 표현
Optional 변수 또는 상수가 아니면 nil을 할당 할 수 없다.
var name:String = "junstone1995"
name = nil // 오류가 발생한다.
var name2:String? = "junstone1995"
name2 = nil // 가능하다.
Optional의 값을 추출하는 가장 간단하지만 가장 위험한 방법
이유는 런타임 오류가 일어날 가능성이 가장 높기 때문이다.
또한 Optional 을 만든 의미가 무색해지는 방법이다.
강제 추출 하려면 Optional 값 뒤에 느낌표(!)를 붙여주면 된다.
만약 값이 nil 이라면 런타임 오류가 발생한다.
var name:String? = "junstone1995"
var nextName:String! = name!
name = nil
nextName = name! //런타임 오류
런타임 오류의 가능성이 있다면 옵셔널 강제 추출은 지양하는 편이 좋다
Optional에 값이 있는지 확인할 때 사용합니다.
Optional에 값이 있다면 Optional에서 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당해서 Optional이 아닌 형태로 사용할 수 있도록 해준다.
if 또는 while 구문 등과 결합하여 사용가능하다.
var name:String? = "junstone1995"
if let myName = name{
print("My name is \(myName)")
}else{
print("name is nil")
}
//My name is junstone1995 을 출력한다.
if var myName = name{
myName = "alpha" //내부에서 값을 바꿀 수 있다.
print("My name is \(myName)")
}else{
print("name is nil")
}
//My name is alpha 을 출력한다.
var yourName:String? = nil
//friend 가 nil이므로 출력되지 않는다.
if let myName = name, let friend = yourName{
print("We are friend \(myName) & \(friend)")
}
yourName = "kimleepark"
if let myName = name, let friend = yourName{
print("We are friend \(myName) & \(friend)")
}
//We are friend junstone1995 & kimleepark 을 출력한다.
nil을 할당하고 싶지만 Optional 바인딩으로 매번 값을 추출하기 귀찮거나 로직상 nil때문에 런타임 오류가 발생하지 않을거 같을 때 사용(매우 위험한 생각)
타입 뒤에 물음표(?)대신 느낌표(!)를 사용하면 된다.
var name:String! = "junstone1995"
print(name)
//Optional("junstone1995")이 출력되고 노란색으로 xcode에서 경고를 표시한다.
print(name!)
//junstone1995 이 출력되고 강제적으로 추출하였다.
if let myName = name {
print("my name is \(myName)")
}else{
print("nil..")
}
//my name is junstone1995 가 추출된다. 암시적으로 하는 추출도 바인딩이 가능하다.