1. 隐式解析可选类型
可选类型暗示了常量或者变量可以“没有值”
把想要用作可选的类型的后面的问号(String?)
改成感叹号(String!)
来声明一个隐式解析可选类型
。与其在使用时把感叹号放在可选类型的名称的后面,你可以在定义它时,直接把感叹号放在可选类型的后面。
当可选类型被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选类型非常有用。隐式解析可选类型主要被用在 Swift 中类的构造过程中.
一个隐式解析可选类型
其实就是一个普通的可选类型
,但是可以被当做非可选类型
来使用,并不需要每次都使用解析
来获取可选值
。下面的例子展示了可选类型 String
和隐式解析可选类型 String
之间的区别:
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要感叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号
你可以把隐式解析可选类型
当做一个可以自动解析
的可选类型
。当你使用一个隐式解析可选值
时,Swift
首先会把它当作普通的可选值
;如果它不能被当成可选类型
使用,Swift
会强制解析
可选值。在以上的代码中,可选值 assumedString
在把自己的值赋给 implicitString
之前会被强制解析
,原因是 implicitString
本身的类型是非可选类型的 String
。在下面的代码中,optionalString
并没有显式的数据类型
。那么根据类型推断
,它就是一个普通的可选类型
。
let optionalString = assumedString
// optionalString 的类型是 "String?",assumedString 也没有被强制解析。
如果你在
隐式解析可选类型
没有值的时候尝试取值
,会触发运行时错误
。和你在没有值的普通可选类型后面加一个感叹号一样。
你可以把隐式解析可选类型
当做普通可选类型
来判断它是否包含值
:
if assumedString != nil {
print(assumedString!)
}
// 输出“An implicitly unwrapped optional string.”
你也可以在可选绑定中
使用隐式解析可选类型
来检查并解析它的值:
if let definiteString = assumedString {
print(definiteString)
}
// 输出“An implicitly unwrapped optional string.”
注意
如果一个变量之后可能变成nil
的话请不要使用隐式解析可选类型
。如果你需要在变量的生命周期中
判断是否是nil
的话,请使用普通可选类型
。