什么是可选型(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 {
随便干点啥
}
网友评论