옵셔널

Optional<자료형>
자료형?

  • 특정 자료형을 Optional형으로 wrapping한다.
  • Optional로 wrapping된 변수의 값은 있을 수도 없을 수도 있다.(nil일 수도 있고 아닐 수도 있다)
  • 옵셔널 변수만 nil로 설정할 수 있다. (옵셔널이 아닌데 nil을 대입하면 에러 발생)
  • 값을 초기화하지 않으면 에러가 발생할 수 있기 때문에 안전성을 위해 사용된다.
  • 함수에 전달되는 인자의 값이 잘못된 경우 오류를 알리기 위해 nil을 반환한다.
  • Optional은 generic이 적용된 enum형.
  • <Wrapped>: Optional에 의해 wrapping되는 자료형
var name1: Optional<String> = nil
var name2: String? = "abc"

print(name2)    //Optional("abc")
print(name2!)    //abc (만약 name2가 nil이면 에러 발생)

public enum Optional<Wrapped>: ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    public init(_ some: Wrapped)
    ~~~
}
var name1: Optional<String> = Optional.some("Kim")
var name2: Optional<String> = .some("Kim")
var name3: Optional<String> = Optional.none
var name4: Optional<String> = .none

Optional Unwrapping

Optional형으로 wrapping되어 있는 자료형으로 선언된 변수의 값이 some 케이스로 존재할 때(nil이 아닐 때) 추출하는 방법

Forced unwrapping

var nameA: String? = "Lee"
var nameB: String = nameA!

  • Optional value가 존재하는 경우 변수 옆에 느낌표(!)를 붙여서 강제로 추출한다.
  • Optional value가 nil일 때 강제 추출하면 에러가 발생한다. 따라서 forced unwrapping 전에 반드시 nil check를 해야 한다.
  • 가장 간단한 방법이지만 가장 위험한 방법이기 때문에 대신 Optional binding을 사용한다.

Optional binding

  • Optional value가 존재하면 일정 블록 안에서 Optional unwrappinge된 형태로 상수나 변수로 바인딩한다.
  • Optional value가 nil이면 통과한다. if, while, guard문과 결합하여 사용한다.

nil coalescing operator(nil 병합 연산자)

A ?? B

  • A가 nil이 아니면 A의 Optional unwrapping된 형태를 반환한다.
  • A가 nil이면 B를 반환한다.

Implicitly Unwrapped Optional

자료형!

  • Optional value가 존재할 때 Optional unwrapping이 필요 없는 Optional형
  • ?를 쓰면 강제추출을 해야 하고 !는 안 해도 된다.

뭔소리임 대체😇 값이 nil이려면 옵셔널 자료형으로 선언되어야 하는데 이때 ?를 쓰면 wrapping되는 거라 사용할 때 unwrapping을 해야 하고, !를 쓰면 안 해도 된다.