当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Optional用法及代码示例


枚举

Optional

表示包装值或 nil 的类型,没有值。

声明

@frozen enum Optional<Wrapped>

概述

每当您使用可选值时,您都会使用 Optional 类型,即使您从未键入单词 Optional 也是如此。 Swift 的类型系统通常会显示包装类型的名称,结尾带有问号 (?),而不是显示完整的类型名称。例如,如果变量的类型为 Int? ,那只是 Optional<Int> 的另一种写法。为了便于阅读和编写代码,首选缩写形式。

以下代码示例中shortFormlongForm的类型相同:


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 letguard letswitch


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 实例会触发运行时错误。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Optional。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。