아래는 스위프트 스탠다드 라이브러리에서 Optional의 내부 구현 일부를 발췌한 내용이다. 보다시피, Optional은 enum 타입으로 정의되어 있다.
enum Optional<Wrapped>: ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped) { self = .some(some) } // .some 케이스의 associated value로 값을 보관
public init(nilLiteral: ()) { self = .none } // ExpressibleByNilLiteral conformance
public func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U? {
switch self {
case .some(let y):
return .some(try transform(y)) // 다시 wrapping 해서 반환
case .none:
return .none
}
}
public func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows -> U? {
switch self {
case .some(let y):
return try transform(y) // 다시 wrapping 하지 않음
case .none:
return .none
}
}
}
let short: Int? = 3
let long: Optional<Int> = 3
let initWithSomeCase = Optional.some(3) // Optional<Int> 타입을 가짐
let initWithNoneCase = Optional.none // nil과 동일
switch short {
case .some(let value):
print("value is: \(value)")
case .none:
print("value is none")
}
if case let .some(value) = short {
print(value) // prints 3
}
references