옵셔널 타입(Optional Type)이 실제로 어떻게 구현되어 있는지 내부를 들여다보자.
옵셔널은 Enum(열거형) 타입으로 구현되어 있고, 두 가지 케이스를 가지고 있다.
값이 associated value 로 들어있는 some 케이스와, 값이 없는 none 케이스가 있다.
또한 Generic으로 선언되어 있어 Int, String 등 어떤 타입이든 가질 수 있다.
enum Optional<Wrapped> {
case some(Wrapped)
case none // nil
}
열거형 케이스 패턴(Enumeration Case Pattern)
옵셔널 자체가 열거형이기 때문에 옵셔널은 아래와 같이 switch 구문을 통해 값이 있고 없음을 확인할 수 있다.
let num: Int? = 10
switch num {
case .some(let value):
print("number is \(value)")
case .none:
print("nil")
}
옵셔널 패턴(Optional Pattern)
옵셔널 패턴은 옵셔널의 두 가지 케이스 중 some 케이스의 연관 값을 상수 또는 변수에 매칭하는 것을 말한다.
옵셔널 패턴은 식별자 패턴 뒤에 물음표(?)를 붙이고 열거형 케이스 패턴이 있는 자리에 표기하면 된다.
let num: Int? = 10
switch num {
case let value?:
print("number is \(value)")
case nil:
print("nil")
}
옵셔널 패턴은 열거형 케이스 패턴의 syntatic sugar로 다음 두 가지는 동일하다.
// 열거형 케이스 패턴
if case .some(let value) = num {
print(value)
}
// 옵셔널 패턴
if case let value? = num {
print(value) // 42
}
특히 옵셔널 타입을 포함하는 배열에서 반복문을 사용하는 경우 옵셔널 패턴을 사용하면 편리하다.
옵셔널 타입이 들어있는 배열의 요소 중 nil이 아닌 값만 순회하고 싶다면 다음과 같이 옵셔널 패턴을 활용할 수 있다.
let arrays: [Int?] = [1, 2, nil, 4, nil]
// 열거형 케이스 패턴
for case .some(let number) in arrays {
print(number)
}
// 옵셔널 패턴
for case let number? in arrays {
print(number)
}
'iOS > Swift' 카테고리의 다른 글
[Swift] Copy-on-Write(CoW) 알아보기 (0) | 2022.10.02 |
---|---|
[Swift] Class와 Struct의 차이 (0) | 2022.09.29 |
[Swift] 옵셔널 바인딩(Optional Binding) (0) | 2021.11.24 |
댓글