스위프트의 옵셔널은 열거형(Enum)으로 구현 되어있다.
이 Enum Optional<Wrapped>
에는 두가지 케이스가 있는데, 하나는 값이 associated value (연관 값)로 들어있는 .some
케이스와, 다른 하나는 값이 없는 .none
케이스다. 그렇기 때문에 아래처럼 열거형 케이스 패턴을 사용해 스위치문 안에서 열거형의 케이스와 매치할 수 있다.
let number: Int? = 42
switch number {
case .some(let value):
print("the number is \(value)")
case .none:
print("there is no number.")
}
옵셔널 패턴은 옵셔널의 두가지 케이스 중 .some
케이스의 연관 값을 상수 또는 변수에 매칭하는 것을 말한다. 옵셔널 패턴은 식별자 패턴 뒤에 물음표를 붙이고 열거형 케이스 패턴이 있는 자리에 표기하면 된다.
//식별자 패턴 (let someOptional)
let someOptional: Int? = 42
//식별자 패턴 (let number)
let number = someOptional
//식별자 패턴 + 물음표 (let number?)
let number? = someOptional
// 열거형 케이스 패턴 if
if case .someCase = someEnum { ... }
// 열거형 케이스 패턴 if + 식별자 패턴 + 물음표
if case let number? = someOptional { ... }
옵셔널 패턴은 열거형 케이스 패턴의 syntatic sugar로서, 다음 두가지는 동일하다.
let someOptional: Int? = 42
// 열거형 케이스 패턴
if case .some(let number) = someOptional {
print(number) // 42
} else if case .none = someOptional {
print("there is no number!!")
}
// 옵셔널 패턴
if case let number? = someOptional {
print(number) // 42
} else if case .none = someOptional {
print("there is no number!!")
}
print(someOptional) // Optional(42)
옵셔널 패턴을 통해 옵셔널에 감싸진 값을 접근할 수 있어서 이 또한 옵셔널 언래핑 방법 중 하나라고 할 수 있다.
만약 옵셔널타입이 들어있는 배열의 요소 중 nil
이 아닌 값만 순회하고 싶다면 다음과 같이 옵셔널 패턴을 활용할 수 있다.
let optionalIntArray: [Int?] = [1,2,nil,4,nil,6,nil,nil,9,10]
// 열거형 케이스 패턴 for + 식별자 패턴 + 물음표 = 옵셔널 패턴
for case let number? in optionalIntArray {
print(number)
/*
1
2
4
6
9
10 */
}
// 위는 다음 열거형 케이스 패턴과 동일하다
for case .some(let number) in optionalIntArray {
print(number)
}
옵셔널에 대한 7가지 개념
force unwrapping ✅
optional binding - if ✅
optional binding - guard ✅
nil coalescing ✅
optional chaining ✅
implicitly unwrapped optional ✅
optional pattern ✅