Swift Optional

  • 이번 글에서는 Swift 언어에서의 optional에 대해 알아보도록 하겠다.

옵셔널

  • 지난 글의 스위프트 특이타입에서 nil은 아무것도 없는 상태라는 것을 알아봤다.
  • 변수만 선언되어 있고, 아직 인스턴스가 할당되기 전의 상태이다.
  • 옵셔널은 이러한 nil을 체크해서 에러가 발생하는 것을 막기 위해 사용한다.
  • 옵셔널은 두 가지 가능성을 가질 수 있다.
  • 한 가지는 값이 있음을 나타내는 nil이 아님을 확신하는 !와
  • 다른 한 가지는 nil의 가능성을 내포하는 ?이다.

옵셔널 타입

  • Int?, String?, Double? 등이 옵셔널 타입이다.
  • 이는 Int, String, Double과는 엄연히 다른 타입이다.
  • 옵셔널 타입은 unwrapping을 통해 사용될 수 있다.
  • Unwrapping 하는 방법에는 3가지가 존재한다.
  • forced unwrapping, optional binding, early exit

Forced unwrapping

func testFuc(optionalStr:String?) {    
    if optionalStr != nil {        
        let unwrapStr:String = optionalStr!        
        print(unwrapStr)        
    }    
}
  • 이는 옵셔널 변수의 값이 nil이 아니라면 !를 통해 옵셔널 변수를 문자열 변수로 변경하는 함수이다.

Optional binding

  • 옵셔널 바인딩은 if let이라는 스위프트의 새로운 문법을 통해
  • 만약 옵셔널 변수의 값이 nil이 아니라면 옵셔널 변수를 unwrapping 해주는 것이다.
func testFuc(optionalStr:String?)
{
    if let unwrapStr = optionalStr
    {
        print(unwrapStr)
    }
}

Early exit

  • guard let else문은 조건값이 거짓일때 실행된다.
  • 즉, 옵셔널 변수의 값이 nil 값이 대괄호안의 코드가 실행된다.
func testFuc(optionalStr:String?) {    
    guard let unwrapStr:String = optionalStr { return }    
    print(unwrapStr)    
    else 
}

Optional Chaining

  • 인스턴스의 프로퍼티나 메소드에 접근하기 위해 옵셔널 체인 연사자를 사용한다.
  • 다음과 같이 말이다.
var displayLabel: UILabel?
displayLabel?.text = “displayLabel에 옵셔널 체이닝 사용”

nil-coalescing

  • 이 기능으로 nil 값일 경우 기본값을 지정해 줄 수 있다.
  • ?? 기호를 사용한다.
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths[“image”] ?? defaultImagePath