@frozen
enum Optional<Wrapped> where Wrapped : ~Copyable
정의
예시
Optional을 ?으로 축약해서 작성할 수 있습니다.
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
some, none 케이스가 있는 열거형입니다.
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"
언래핑
옵셔널 바인딩
if let starPath = imagePaths["star"] {
print("The star image is at '\\(starPath)'")
} else {
print("Couldn't find the star image")
}
// Prints "The star image is at '/glyphs/star.png'"
옵셔널 체이닝
if imagePaths["star"]?.hasSuffix(".png") == true {
print("The star image is in PNG format")
}
// Prints "The star image is in PNG format"
Nil 병합 연산자
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"
강제 언래핑
let number = Int("42")!
print(number)
// Prints "42"
map 함수
self의 값이 있는 경우 Optional에 감싸서 transform을 합니다.
transform의 반환값 (U)가 Optional이라면 map함수의 반환값은 이중 Optional이 됩니다.
public func map<E: Error, U: ~Copyable>(
_ transform: (Wrapped) throws(E) -> U
) throws(E) -> U? {
switch self {
case .some(let y):
return .some(try transform(y))
case .none:
return .none
}
}
flatMap 함수
self의 값이 있는 경우 바로 transform을 합니다.
public func flatMap<E: Error, U: ~Copyable>(
_ transform: (Wrapped) throws(E) -> U?
) throws(E) -> U? {
switch self {
case .some(let y):
return try transform(y)
case .none:
return .none
}
}