Swift 中的可选型

作者: 小伟伟 | 来源:发表于2015-03-05 17:49 被阅读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 {
        随便干点啥
    }
    

    相关文章

      网友评论

        本文标题:Swift 中的可选型

        本文链接:https://www.haomeiwen.com/subject/qynmxttx.html