: 옵셔널은 nil값이 존재할 수 있는 타입들을 지칭합니다.
//ex) Optional<String>, Optional<Int> ...
예를 보면 옵셔널 타입이 뭔지 이해하실 수 있습니다.
let strNumber = "123"
let intCasting = Int(strNumber)
print(type(of: intCasting) // -> Optional<Int>
위 같이 String 값을 Int 타입으로 케스팅 한 다음, 타입을 출력하면 Int가 아니라 "Optional" 가 나옵니다. 🤔
let strNomal = "abc"
let intCasting = Int(strNomal)
print(intCasting) // -> nil
만약 숫자형 문자가 아닌 영어나 다른 언어를 int로 케스팅하는 경우 nil 이 출력됩니다.
즉, 옵셔널타입이란 값이 존재하지 않을 수도 있는 경우의 타입을 말합니다.
nil값이 필요한 옵셔널 타입의 프로퍼티(변수, 상수)를 생성하고 싶을 시 타입뒤에 ? 를 추가해주시면 됩니다.
ex) var str: String?,var num: Int? ...
옵셔널타입은 항시 nil 값에 대해서 처리를 해줘야 합니다. 방법으로는 "Forced Unwrapping" 과 "Optional Binding" 이 존재합니다.
! 를 통해서 옵셔널 값을 처리할 수 있습니다.
et strNumber = "123"
let intCasting = Int(strNumber)!
print(type(of: intCasting) // -> Int
! 를 추가했더니 전과 다르게 Int 타입을 출렸했습니다.
❗️하지만 Forced Unwrapping 런타임 오류에 취약합니다. 그래서 nil값이 존재하지 않는다고 확신한 경우에만 사용해야 합니다.
let strNomal = "abc"
let intCasting = Int(strNomal)
print(intCasting!) // 언래핑시 Error --> Fatal error: Unexpectedly found nil while unwrapping an Optioanl value.
옵셔널 바인딩은 조건문(if, while, guard)을 통하여 nil 값을 처리하는 방식입니다.
ex) if로
let strNomal = "abc"
let intCasting = Int(strNomal)
if let binding = intCasting {
print("\(binding)")
} else {
print("binding is nil") // nil 처리
}
// -> binding is nil
ex) guard문(my love)
let strNomal = "abc"
let intCasting = Int(strNomal)
guard let binding = intCasting else {
return
}
print(binding) // -> 아무값 안나옴. nil 에 대해 출력을 원하면 else 블록안에다 추가하면 되요!
- ~이름이 멋있다.~
- else를 먼저 catch 함으로 빠른 종료가 가능하다. -> else 블록을 실행 후 메소드에서 벗어납니다!
- 메소드 내에서만 사용가능하다.
- 옵셔널 바인딩한 상수의 Scope가 다르다❗️
func optionalBindingIf() {
if let binding = intCasting {
print("\(binding)")
} else {
print("binding is nil") // nil 처리
}
let message = binding // Error-> Cannot fint 'binding' in scope : if문 밖에서는 바인딩한 상수에 접근 할 수 없음! ☹️
}
func optionalBindingGuard() {
guard let binding = intCasting else {
return
}
let message = binding // 바인딩한 값을 guard 구문 밖에서 사용가능합니다! 👍
}
🧐