31.8. 隐式解析可选类型

当可以被访问时,Swift 语言定义后缀 ! 作为标准库中命名类型 Optional 的语法糖,来实现自动解包的功能。如果尝试对一个值为 nil 的可选类型进行隐式解包,将会产生运行时错误。因为隐式解包,下面两个声明等价:

var implicitlyUnwrappedString: String!
var explicitlyUnwrappedString: Optional<String>

注意类型与 ! 之间没有空格。

由于隐式解包会更改包含该类型的声明语义,嵌套在元组类型或泛型中可选类型(比如字典元素类型或数组元素类型),不能被标记为隐式解包。例如:

let tupleOfImplicitlyUnwrappedElements: (Int!, Int!)  // 错误
let implicitlyUnwrappedTuple: (Int, Int)!             // 正确
let arrayOfImplicitlyUnwrappedElements: [Int!]        // 错误
let implicitlyUnwrappedArray: [Int]!                  // 正确

由于隐式解析可选类型和可选类型有同样的类型 Optional,你可以在所有使用可选类型的地方使用隐式解析可选类型。比如,你可以将隐式解析可选类型的值赋给变量、常量和可选属性,反之亦然。

正如可选类型一样,如果你在声明隐式解析可选类型的变量或属性的时候没有指定初始值,它的值则会自动赋为默认值 nil

可以使用可选链式调用对隐式解析可选表达式选择性地执行操作。如果值为 nil,就不会执行任何操作,因此也不会产生运行错误。

关于隐式解析可选类型的更多细节,请参阅 31.8. 隐式解析可选类型

隐式解析可选类型语法

implicitly-unwrapped-optional-type

隐式解析可选类型 → 类型 !

下一节:协议合成类型定义了一种遵循协议列表中每个指定协议的类型,或者一个现有类型的子类并遵循协议列表中每个指定协议。协议合成类型只能用在类型注解、泛型形参子句和泛型 where 子句中指定类型。