什么是可选型(Optional)
先从一个例子看起
var age: Int = 35
var height:Int = 180
上面定义了两个变量,都是Int型,数值分别为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上面并把它呈现在屏幕上,通过navigation controller把它push出来。
正如你知道的那样,每一个ViewController的实例都有一个property叫做navigationController。但是如果你创建的是基于navigation controller的程序,那么你的master view controller中的该property已经是被自动的设置好了。如果你使用的是single app 模板创建的程序,那么该property并没有被自动的设置,所以你的app的默认的view controller并没有任何东西存储在他名为navigationController的property中。
那么该情况下,使用可选型就比较合适了,
先看一下UIViewController的定义
var navigationController:UINavigationController? {get}
如果你确定知道view controller中navigation controller不会为nil,那么你可以通过!来强制解包
controller.navigationController!.pushViewController(myViewController, animated:true)
!: 当把!放到一个变量后面,你通知编译器你根本不关心这个类型是可选型,你明确知道执行到这一句的时候,这个变量一定是有值,不会是nil。(当navigationController不知道为什么是nil的时候,执行就会crash,所以当你百分之百确定的时候使用!)
当你不是很明确的时候,就使用?
controller.navigationController?.pushViewController(myViewController, animated:true)
? 当吧?放到一个变量后面的时候,你其实不是很明确是否改变量是nil还是有值的。所以上面的意思就是:当navigationController有值的时候,就接着执行后面,否则就相当于nil。等价于
if(controller.navigationController){
controller.navigationController.pushViewController(myViewController, animated:true)
}
但是问题来了,我想当他是nil的时候执行别的代码的时候。if let就应运而生了
if let :针对上面的疑问,可以这么写
if let nav = controller.navigationController{
nav.pushViewController(myViewController,animated:true)
} else {
随便干点啥
}