iOS开发入门程序

Swift 中的可选型

2015-03-05  本文已影响499人  小伟伟
什么是可选型(Optional)

先从一个例子看起

var age: Int = 35
var height:Int = 180

上面定义了两个变量,都是Int型,数值分别为35180,但是不能给这两个变量赋值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并没有任何东西存储在他名为navigationControllerproperty中。

那么该情况下,使用可选型就比较合适了,
先看一下UIViewController的定义

var navigationController:UINavigationController? {get}

如果你确定知道view controllernavigation 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 {
    随便干点啥
}
上一篇 下一篇

猜你喜欢

热点阅读