可选暗示了常量或者变量可以“没有值”。
可选可以通过 if 语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。
有时候在程序中,第一次被赋值之后,可以确定一个可选总会有值。
在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。
这种情况下的可选类型可以被定义为:隐式解析可选(implicitly unwrapped optionals)。
声明一个隐式解析可选的方式是:把可选的类型的后面的问号(String? )改成感叹号(String!
一个隐式解析可选本质上是一个普通的可选,但是可以被当做非可选使用,
并不需要每次都使用解析来获取可选值。
下面的例子说明了可选 String 和隐式解析可选 String
let possibleString:String? = "An optional string"
print(possibleString!)
let assumedString:String! = "An implicitly string"
print(assumedString!)
可以把隐式解析可选当做一个可以自动解析的可选。
只要声明的时候把惊叹号!放到类型的结尾,而不是在每次取值时,把惊叹号!放到可选名字的结尾。
如果隐式解析可选没有值,尝试取值会触发运行时错误。
和在没有值的普通可选后面加一个惊叹号是一样的。
当然,仍然可以把隐式解析可选当做普通可选来判断它是否包含值
在可选绑定中使用隐式解析可选来检查并解析它的值
如果一个变量值可能变成 nil 的话请不要使用隐式解析可选。
如果你需要在变量的生命周期中判断是否是 nil 的话,请使用普通可选
隐式装包是拆包的逆过程,即“不可空类型”转变成“可空类型”
由于可空类型比不可空类型的精度高,因此这是一个“泛化”过程
由于没有精度的损失,因此在swift中这个过程是自动进行的
当我们将一个不可空类型赋值给一个可空类型时,隐式装包自动发生
如:
let a = 1
var b: Int ? = a
强制装包,
我们也可以强制装包,将一个非可空类型转变为可空类型
如上例子中
var a:Int = 1
var b:Int ? = Optional(a)
由于隐式装包和强制装包的效果是相同的。大部分情况下,
当我们需要将一个不可空类型转变为对应的可空类型时,我们使用隐式装包即可
if let
print(definiteSting)
else
print(assumedString)
}
可选会让你检查可能存在的或者也可能不存在的值,
这样,你就可以在编码过程中处理缺乏的值。
然而,在某些情况下,如果值不存或者不满足某些条件时,你的代码可能不需要继续执行。
在这些情况下,你可以在代码结束执行之前触发一个断言(assertion),
并通过调试来查找值缺失或无效的原因
断言会在运行时判断一个逻辑条件是否为true。
断言:
如果条件的结果为 true,代码正常执行;
如果条件的结果为 false,代码执行结束,并终止应用程序。
在调试环境中触发断言:
比如当你在 Xcode 构建和运行一个应用程序,断言触发时,
你可以看到错误状态发生的确切位置和查询应用程序的状态。
此外,断言允许你附加一条调试信息。
你可以使用全局 assert 函数来写一个断言。
向 assert 函数传入一个结果为 true 或者 false 的表达式以及一条信息,
当表达式为 false 的时候这条信息会被显示:
let age = -3
assert(age >= 0, "An age cannot be less than zero ")
在这个例子中,只有 age >= 0 的时候代码才会继续运行。
如果 age 的值是负数,那么 age >= 0 为 false,断言被触发,结束应用。
断言信息不能使用字符串插值。
断言信息可以省略,就像这样
assert( age >= 0 )
当条件可能为假时触发断言,但是最终一定要保证条件为真,这样代码才能继续运行。
断言的适用情景:
整数下标索引被传递一个定制的下标实现,下标索引值可能太小或者太大。
给函数传入一个值,但是非法的值可能导致函数不能正常执行。
可选值现在是 nil,但是后面的代码运行需要一个非nil值。
断言会导致应用终止运行,所以代码的设计要避免非法条件的出现。
但是,在应用发布之前,非法条件的出现触发断言可以快速发现问题。