var studentName: String? = "철수"
*빈 문자열과 nil은 같지 않다.
optional unwrapping: 옵셔널 값을 옵셔널이 아닌 값으로 추출하는 것
=> 가장 간단하나 가장 위험함(런타임 오류 가능성 가장 높기 때문, 옵셔널 만든 의미 무색해짐), 'xcode! 내가 너보다 코드 잘 파악하고 있으니까 unwrapping해!'이런 느낌으로 사용함
var myName: String? = "alex"
// 옵셔널이 아닌 값에 옵셔널 못 들어감. 추출해서 할당해주어야 함.
var alex: String = myName!
myName = nil
alex = myName! // 런타임 오류
//if 구문 등 조건문 이용해 좀 더 안전하게 처리 가능하지만 myName이 나올 때 마다 느낌표(!)를 붙여 unwrapping 해야함.
if myName != nil {
print("My name is \(myName!)")
}else {
print("myName == nil")
}
// myName == nil
var myName: String? = "alex"
// 옵셔널 바인딩 통한 임시 상수 할당
if let name = myName {
print("My name is \(name)")
}else {
print("myName == nil")
}
// My name is alex
// 옵셔널 바인딩 통한 임시 변수 할당
if var name = myName {
name = "wizpaln" // 변수이므로 내부에서 변경 가능
print("My name is \(name)")
}else {
print("myName == nil")
}
// My name is wizplan
상수 name은 if 블록 안에서만 사용(else 블록에서도 사용 불가) 하기 때문에 충돌X
var myName: String? = "alex"
var yourName: String? = nil
// friend에 바인딩 안되서 실행 안됨
if let name = myName, let friend = yourName {
print("We are friend! \(name) & \(friend)")
}
yourName = "hudson"
if let name = myName, let friend = yourName {
print("We are friend! (name) & \(friend)")
}
// We are friend! alex & hudson
optional ?? defaultValue
?? : 앞의 optional이 nil인지, 아닌지 확인하는 역할
optional이 nil이면 defaultVaue를 사용하고,
nil이 아니면 optional에 할당된 값 사용.
optional?.property
optional?.method
위의 다른 방법들은 optional이 간단한 값을 가졌을 때 사용하지만 optional chaining의 경우는 optional이 structure와 같은 구조를 가졌을 때 optional의 property, method에 접근하기 위해 사용한다.
optional이 nil인 경우 충돌은 일어나지 않지만 property와 method는 어떠한 값도 가질 수 없다.(즉, nil이다.) 하지만 nil이 아닌 경우 property와 method에 접근가능하다.
nil 때문에 런타임 오류 발생 안 할거라는 확신이 들거나 optional binding으로 매번 값 추출이 귀찮을 때 nil을 할당해 줄 수 있는 옵셔널이 아닌 변수나 상수가 있으면 좋다
=> 값이 nil이 아니라는 확신이 있으면 느낌표(!)로 unwrap한 변수 or 상수가 있으면 좋다.
Implicitly Unwrapped Optional은 타입 뒤에 느낌표(!)를 사용
var myName: String! = "alex"
⭐︎ 옵셔널 사용 시 옵셔널 바인딩, nil 병합 연산자, 옵셔널 체이닝 사용이 훨씬 안전함.