안전성이 높은 Swift에서 값을 처리하는 과정에서 발생할 수 있는 오류를 최대한 피하고자 도입한 개념
Optional은 ? 를 통해 표현합니다.
let nickname: String?
nickname = "RRAE"
print(nickname)
위 예시에서 nickname은 값이 있을 수도, 없을 수도 있기 때문에 Optional("RRAE") 라는 Optional로 포장(wrapping) 되어있는 출력 결과를 볼 수 있습니다.
이렇게 오류를 최대한 피하는 것은 좋지만, 앱에서 닉네임이 Optional로 포장 되어 있는 값으로 보여줄 수는 없죠... 그래서 올바른 출력값을 보여주기 위해 Unwrapping을 해야합니다!
값이 100% 문제가 없을 때,
!를 사용해 unwrapping할 수 있습니다.
하지만, 값이 nil일 경우에 앱이 꺼질 수도 있다는 아주아주 극단적인 방법입니다.
let nickname: String?
nickname = "RRAE"
print(nickname!)
출력값은 Optional이 unwrapping된 저의 닉네임인 RRAE가 제대로 나오는 모습을 볼 수 있습니다
let nickname: String?
nickname = nil
print(nickname!)

닉네임 변수의 nil값을 저장하고 강제 추출을 하게 되면 빨간색의 무서운 오류를 만날 수 있습니다.
Optional Binding은 Forced Unwrapping보다 소심해서 먼저 Optional타입으로 선언된 변수에 값이 nil인지 아닌지를 확인합니다.
let nickname: String? = "RRAE"
if let myNickname = nickname {
print(myNickname)
} else {
print("nil")
}
nickname에 값이 있을 경우 Optional 타입 변수인 nickname의 값이 unwrapping되어 myNickname 상수에 저장되어 정상적인 값이 출력됩니다.
하지만, nickname 값이 nil일 경우 else문이 실행되게 됩니다.
❗️초미세먼지 팁
let nickname: String? = "RRAE"
if let nickname {
print(nickname)
} else {
print("nil")
}
let nickname: String? = "RRAE"
let age: Int? = 100
if let nickname, let age {
print(nickname, age)
} else {
print("nil")
}
let nickname: String? = "RRAE"
guard let myNickname = nickname else {
print("nil")
return
}
print(myNickname)
if-let 방식과 유사하지만, nickname의 값이 nil일 경우를 먼저 확인해서 값이 nil이면 else구문이 실행이 되어 return 이 됩니다. nil이 아닐 경우에는 정상적인 값이 출력됩니다.
guard방식도 if-let방식과 똑같이 단축 구문을 사용할 수 있고, 여러 Optional 타입 변수를 바인딩 할 수 있습니다!!
let nickname: String? = "RRAE"
let age: Int? = 100
guard let nickname, let age else {
print("nil")
return
}
print(nickname, age)
let nickname: String? = "RRAE"
print(nickname ?? "손님")
?? 를 기준으로 좌측에는 정상적인 값이 있을 경우, 우측에는 nil일 경우 출력되는 값을 작성하면됩니다.