Swift

[Swift] Optional(옵셔널)

moving 2022. 3. 17. 20:58
728x90

 

옵셔널은 enum이다.

enum Optional<T> {
    case None // not set
    case Some<T> // set, T는 연관값
}
  • Optional<T>에서 <T>는 옵셔널이 모든 타입의 옵셔널이 될 수 있다는 뜻
let x: String? = nil // = Optional<String>.None

let x: String? = "hello" // = Optional<String>.Some("hello"), 연관값 hello

 

옵셔널을 unwrapped 하는 방법

1. switch를 사용해서 옵셔널을 unwrapped해 연관값을 가져오는 방법

switch x {
    case Some(let value): y = value 
    case None: // error: raise an exception
}
  • 값이 없으면 런타임 오류가 발생함

2. if let을 사용한 방식

let x: String? = ...
if let y = x {
    // do something with y
}
// ==
switch x {
    case .Some(let y):
        // do something with y
    case .None:
        break
}

 

옵셔널 체이닝(Optional Chaining)

if let으로 unwrapped 하던 방식을 옵셔널 체이닝을 사용하여 아래와 같은 방식으로 unwrapped

var display: UILabel?
if let label = display {
    if let text = label.text {
        let x = text.hashValue
        ...
    }
}
// or
if let x: Int? = display?.text?.hashValue { ... }
// 일단 언래핑을 시도해보고 언래핑을 할 수 있다면 그 값을 이용해서 다음걸로 이동하는 식
// 언래핑을 할 수 없다면 이 전체 표현에서 nil을 반환

 

?? 을 사용하여 unwrapped

  • nil 일 때의 기본값을 제공
let s: String? = ... // might be nil
if s != nil {
    display.text = s
} else {
    display.text = " "
}

// can be expressed much more simply this way...
display.text = s ?? " "
// s가 nil이 아니라면 값이 언래핑되어서 사용될 것이고 그렇지 않다면 " " 빈공간