Swift

[Swift] Optinoal이란? Wrapping/Unwrapping

ji_iin 2021. 10. 2. 12:31

Optional

변수를 Optional 타입으로 사용하면 변수에 값이 있을 수도 없을 수도 있게 사용할 수 있다.

기본적으로 변수를 선언할 때 nil 값이 들어가면 안되는데

? 를 붙이면 Optional로 선언되어 nil이여도 에러가 발생하지 않는다.

사용할 때는 타입뒤에 ? 를 붙이면 Optional type으로 선언된다.

Optional 타입에 nil 값을 넣지 않아도 기본 값은 nil로 저장된다.

 

Wrapping

Optional 타입의 값은 기본적으로 wrap, 즉 싸여져있는 상태이다.

이 말은 Optional으로 선언된 값이 값이 있는건지 없는건지(nil) wrapping 되어 있어서 알 수 없는 상태이다.

그래서 Optional 타입으로 선언된 값을 그대로 프린트 하면 값 그대로 출력되는 것이 아니라 Optional로 감싸서 출력이된다.

그래서 Unwrapping 즉, 싸여져 있는 값을 벗겨내야된다.

Unwrapping

wrapping 된 값을 꺼내서 확인할 수 있는 5가지 방법이 있다.

1. Force Unwrapping

  • Optional 선언부 = type?
  • Optional 사용 = text!
let text: String? //Optional 
let text2: String = text!

2. Check for nil Value

  • nil 값인지 아닌지 확인
let myOptinoal: String?

myOptinoal = nil
if myOptinoal != nil{
    let text: String = myOptinoal!
    let text2: String = myOptinoal!
}else{
    print("myOptional은 nil")
}

3. Optional Binding

  • 값을 직접 건들지 않고 새 변수를 둬서 그 값이 변수랑 같은지, nil인지 확인
let myOptinoal: String?

myOptinoal = "Julia"
if let safeOptional = myOptinoal{
    let text: String = safeOptional
    let text2: String = safeOptional
    print(safeOptional+"!!")
}else{
    print("myOptional은 nil")
}

4. Nil Coalescing Operator

  • 선언 : optional ?? defaultValue
let myOptinoal: String?

myOptinoal = nil

let text: String = myOptinoal ?? "default Value"

print(text) //default Value 출력

5. Optional Chaining

  • 체인이 들어간 것처럼 느낌이 묶여있을 것 같은 느낌일 것인데,
  • myOptional 프로퍼티들이 묶여있어 property의 타입은 옵셔널이 아니지만 접근하려고 한 myOpional이 옵셔널 타입이기 때문에 최종 값을 Opional이 된다.
//선언
optional?.property
optional?.method()
struct MyOptional {
    var property = 123
    func method() {
        print("struct method!")
    }
}
let myOptinoal: MyOptional?

myOptinoal = MyOptional()

myOptinoal?.method()

 

 

관련 공식자료 : http://[https://jusung.gitbook.io/the-swift-language-guide/language-guide/16-optional-chaining](https://jusung.gitbook.io/the-swift-language-guide/language-guide/16-optional-chaining)