옵셔널(Optional)의 내부 구조

SeBin·2025년 1월 5일
post-thumbnail

Optional의 타입은 Enum

흔히 nil 값은 값이 없는 걸 의미하는 데, 정확히는 값이 없다는 걸 의미하는 값이 들어있는 형태입니다.

enum Optional<Wrapped>{
    case some(Any)
    case none
}

옵셔널은 Enum 타입으로 이루어져 있고, 값이 존재하는 경우인 some과 존재하지 않는 경우인 none 케이스로 이루어져 있습니다.

저희는 이 Optional.none 값을 nil 이라고 부릅니다.

옵셔널 체이닝(Optional Chaining) 문법

옵셔널 타입에 . 접근 연산자를 사용할 때, nil일수도 있음을 알리기 위해서 반드시 앞에 ?를 붙여야합니다.

class Dog {
    var name: String?
    var weight: Int
    init(name: String, weight: Int) {
        self.name = name
        self.weight = weight
    }
}

class Human {
    var dog: Dog?
}

var human = Human()
human.dog = "choco"
human.dog?.name
print(human.dog?.name)     // Optional("choco")
  • 옵셔널 체이닝의 결과는 항상 옵셔널입니다.
  • 옵셔널체이닝에 값 중에서 하나라도 nil을 리턴한다면, 이어지는 표현식을 평가하지 않고 nil을 리턴합니다.

옵셔널 체이닝 Unwrapping

// 1. !로 강제로 벗기기
print(human2!.dog!.name)

// 2) if let 바인딩
if let name = human2?.dog?.name
    print(name)
}

// 3) Nil-Coalescing 연산자
var defaultName = human2?.dog?.name ?? "까망이"
print(defaultName)
  • ! 를 사용해서 강제로 해제시키는건 런타임 에러로 앱이 강제 종료될 수 있으니 사용하지 않는 걸 추천드립니다.

0개의 댓글