Optional
nil
的类型,没有值。声明
@frozen enum Optional<Wrapped>
概述
每当您使用可选值时,您都会使用 Optional
类型,即使您从未键入单词 Optional
也是如此。 Swift 的类型系统通常会显示包装类型的名称,结尾带有问号 (?
),而不是显示完整的类型名称。例如,如果变量的类型为 Int?
,那只是 Optional<Int>
的另一种写法。为了便于阅读和编写代码,首选缩写形式。
以下代码示例中shortForm
和longForm
的类型相同:
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
Optional
类型是具有两种情况的枚举。 Optional.none
等价于 nil
文字。 Optional.some(Wrapped)
存储一个包装的值。例如:
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"
您必须先解开 Optional
实例的值,然后才能在许多上下文中使用它。因为 Swift 提供了几种安全解包可选值的方法,所以您可以选择一种可以帮助您编写清晰、简洁的代码的方法。
以下示例使用此图像名称和文件路径字典:
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
使用键获取字典的值会返回一个可选值,因此 imagePaths["star"]
具有类型 Optional<String>
或以首选方式编写的 String?
。
可选绑定
要有条件地将 Optional
实例的包装值绑定到新变量,请使用可选的绑定控制结构之一,包括 if let
、 guard let
和 switch
。
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'"
可选链
要安全地访问包装实例的属性和方法,请使用后缀可选链接运算符(后缀 ?
)。以下示例使用可选链接访问 String?
实例上的 hasSuffix(_:)
方法。
if imagePaths["star"]?.hasSuffix(".png") == true {
print("The star image is in PNG format")
}
// Prints "The star image is in PNG format"
使用 Nil-Coalescing 运算符
如果 Optional
实例是 nil
,请使用 nil-coalescing 运算符 ( ??
) 提供默认值。这里为 imagePaths
中缺少的图像提供了默认路径。
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"
??
运算符也适用于右侧的另一个 Optional
实例。因此,您可以将多个 ??
运算符链接在一起。
let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"
无条件展开
当您确定 Optional
的实例包含一个值时,您可以使用强制展开运算符(后缀 !
)无条件地展开该值。例如,失败的Int
初始化程序的结果在下面的示例中被无条件地解包。
let number = Int("42")!
print(number)
// Prints "42"
您还可以使用后缀 !
运算符执行无条件可选链接。
let isPNG = imagePaths["star"]!.hasSuffix(".png")
print(isPNG)
// Prints "true"
使用 !
无条件地展开 nil
实例会触发运行时错误。
可用版本
相关用法
- Swift Optional.Publisher reduce(_:_:)用法及代码示例
- Swift Optional.Publisher tryDrop(while:)用法及代码示例
- Swift Optional symbolVariant(_:)用法及代码示例
- Swift Optional popover(isPresented:attachmentAnchor:arrowEdge:content:)用法及代码示例
- Swift Optional.Publisher debounce(for:scheduler:options:)用法及代码示例
- Swift Optional.Publisher breakpoint(receiveSubscription:receiveOutput:receiveCompletion:)用法及代码示例
- Swift Optional mask(alignment:_:)用法及代码示例
- Swift Optional.Publisher mapError(_:)用法及代码示例
- Swift Optional listSectionSeparatorTint(_:edges:)用法及代码示例
- Swift Optional badge(_:)用法及代码示例
- Swift Optional.Publisher catch(_:)用法及代码示例
- Swift Optional.Publisher tryAllSatisfy(_:)用法及代码示例
- Swift Optional.Publisher zip(_:_:_:)用法及代码示例
- Swift Optional fullScreenCover(isPresented:onDismiss:content:)用法及代码示例
- Swift Optional.Publisher sink(receiveValue:)用法及代码示例
- Swift Optional keyboardType(_:)用法及代码示例
- Swift Optional clipShape(_:style:)用法及代码示例
- Swift Optional.Publisher scan(_:_:)用法及代码示例
- Swift Optional.Publisher throttle(for:scheduler:latest:)用法及代码示例
- Swift Optional preferredColorScheme(_:)用法及代码示例
- Swift Optional.Publisher assertNoFailure(_:file:line:)用法及代码示例
- Swift Optional background(_:ignoresSafeAreaEdges:)用法及代码示例
- Swift Optional saturation(_:)用法及代码示例
- Swift Optional focusSection()用法及代码示例
- Swift Optional overlay(alignment:content:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Optional。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。