什么是可選型(Optional)
先從一個例子看起
var age: Int = 35
var height:Int = 180
上面定義了兩個變量,都是Int型,數(shù)值分別為35和180,但是不能給這兩個變量賦值nil。這樣就需要可選型了(Optional)。
可選型其實是枚舉類型(enum)
enum Optional : NilLiteralConvertible{
case None
case Some(T)
}
Optional<Int>的值是nil或者Int
在下面的代碼中聲明了兩個可選型變量。?表示是一個可選型
var age:Int? = nil
var height:Int? = 180
以height為例:與下面的代碼是等效的。
var height:Optional<Int> = Optional <Int>(180)
什么時候使用? !
假定有一個基于UIKit 的iPhone App,在view controller中有一些代碼可以把新的view controller 弄到前一個view controller上面并把它呈現(xiàn)在屏幕上,通過navigation controller把它push出來。
正如你知道的那樣,每一個ViewController的實例都有一個property叫做navigationController。但是如果你創(chuàng)建的是基于navigation controller的程序,那么你的master view controller中的該property已經(jīng)是被自動的設(shè)置好了。如果你使用的是single app 模板創(chuàng)建的程序,那么該property并沒有被自動的設(shè)置,所以你的app的默認(rèn)的view controller并沒有任何東西存儲在他名為navigationController的property中。
那么該情況下,使用可選型就比較合適了,
先看一下UIViewController的定義
var navigationController:UINavigationController? {get}
如果你確定知道view controller中navigation controller不會為nil,那么你可以通過!來強制解包
controller.navigationController!.pushViewController(myViewController, animated:true)
!: 當(dāng)把!放到一個變量后面,你通知編譯器你根本不關(guān)心這個類型是可選型,你明確知道執(zhí)行到這一句的時候,這個變量一定是有值,不會是nil。(當(dāng)navigationController不知道為什么是nil的時候,執(zhí)行就會crash,所以當(dāng)你百分之百確定的時候使用!)
當(dāng)你不是很明確的時候,就使用?
controller.navigationController?.pushViewController(myViewController, animated:true)
? 當(dāng)吧?放到一個變量后面的時候,你其實不是很明確是否改變量是nil還是有值的。所以上面的意思就是:當(dāng)navigationController有值的時候,就接著執(zhí)行后面,否則就相當(dāng)于nil。等價于
if(controller.navigationController){
controller.navigationController.pushViewController(myViewController, animated:true)
}
但是問題來了,我想當(dāng)他是nil的時候執(zhí)行別的代碼的時候。if let就應(yīng)運而生了
if let :針對上面的疑問,可以這么寫
if let nav = controller.navigationController{
nav.pushViewController(myViewController,animated:true)
} else {
隨便干點啥
}