nil (nil类型)
可选类型变量没有值的时候,可以通过给它指定nil来表示.
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
注意点:
非可选类型的常量或者变量,不可以使用nil来赋值.如果你的代码中需要一个常量或者变量,在某些情况下来接收处理一个值的有无情况,只要定义相关类型的的可选值即可.
如果在定义可选类型的常量或者变量时没有指定确切的值,那么这个常量或者变量自动的被系统设置为nil:
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
注意点:
在Swift中,nil与OC中的nil是不一样的.在OC中,nil是一个指向空对象的指针;但是在Swift中,nil不是一个指针,它是某种类型值的空值,任何可选类型都可以设置为nil,不仅限制于对象类 型.
Implicitly Unwrapped Optionals (隐式解包可选类型)
如前所述,可选类型的常量或者变量是可以没有值的.可选类型也可以使用if语句来检测是否有值,也可以使用可选绑定进行条件判断来访问这个值(如果值存在的话).
有时候,根据程序的结构可以明确的知道,一个可选类型在第一次设置后总是会有值.在这种情况下,访问它的时候完全可以不用每次都检测和解包.因为在有值的情况下,使用可选类型 是安全的.
这种情况的可选类型,叫做隐式解包可选类型.隐式解包可选类型的写法是在类型的后面添加一个感叹号(!)而不是问号(?).
在一个可选类型的值总是被确认存在的时候,隐式解包可选类型非常适用.它主要的用途是用在类的初始化期间.
隐式解包可选类型也是一种普通的可选类型.但是它也可以被当做非可选类型来使用,不需要在每次访问值的时候进行解包操作.下面的代码样例演示了可选类型的String和隐式解包可 选类型String的不同:
let possibleString: String? = "An optional string."
println(possibleString!) // requires an exclamation mark to access its value
// prints "An optional string."
let assumedString: String! = "An implicitly unwrapped optional string."
println(assumedString) // no exclamation mark is needed to access its value
// prints "An implicitly unwrapped optional string.”
你可以将隐式解包可选类型当做一种每次访问内部值的时候都会自动解包的可选类型,而不用在每次使用它的时候都在它后面添加一个感叹号(!).只在定义它的时候使用感叹号(!).
注意点:
如果试图访问(存取)一个没有值的隐式解包可选类型,将会触发一个运行时错误.这个错误与在一个没有值的普通可选类型后面使用感叹号(!)是一样的.
一个隐式解包可选类型可以当做普通的可选类型来对待,检测是否包含值:
if assumedString {
println(assumedString)
}
// prints "An implicitly unwrapped optional string.”
隐式解包可选类型也可以使用可选绑定来检测和解包内部的值.
if let definiteString = assumedString {
println(definiteString)
}
// prints "An implicitly unwrapped optional string.”
注意点:
当一个变量可能会在后面的某个时刻是空值nil的情况下,不可以使用隐式解包可选类型.在变量的生命周期中,如果要检测这个变量的nil值,只能使用普通的可选类型.
Assertions (断言)
可选类型可以帮助你检测一个值存在或者不存在,在代码中如意的处理一个值的有无情况.然而在某些情况下,如果一个值不存在,或者值不符号某种安全条件,代码将不会继续执行下 去.这时候,可以在代码中触发一个assertion(断言)来结束代码执行,并提供一个机会来调试原因.
/********************待续......************************/