美文网首页
Swift中? 、! 和 ??

Swift中? 、! 和 ??

作者: 赵哥窟 | 来源:发表于2020-08-14 11:27 被阅读0次

    Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型声明后加一个 ? 操作符完成的。
    例如: var name: String?

    Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None , 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因。这里是enum Optional的定义

    enum Optional<T> : LogicValue, Reflectable {  
            case None  
            case Some(T)  
            init()  
            init(_ some: T)  
            /// Allow use in a Boolean context.  
            func getLogicValue() -> Bool  
           /// Haskell's fmap, which was mis-named  
            func map<U>(f: (T) -> U) -> U?  
            func getMirror() -> Mirror 
    }
    

    ? 和 ! 使用

    一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:

    if name { 
    // 有值再操作
    }
    

    在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,如果是nil值,也就是Optional.None,会跳过后面的操作不执行,如果有值,就是Optional.Some,可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,来保证执行这个操作的安全性。

    ? 的使用场景:

    1.声明Optional值变量
    2.用在对Optional值操作中,用来判断是否能响应后面的操作
    3.使用 as? 向下转型

    下面声明一个对象Person为可选类型,或者一个可选的String

    var person:Person?
    var str:String?
    var num:NSNumber!
    

    可选类型 可以不用初始化,如果不是可选类型,必须在init下进行初始化。保证在调用的时候不是nil

    可选类型在调用的时候必须加上?或者!,声明的时候用的!的可以不加

     let str:String! = "Hello"
            let greeting = "World!"
            if str != nil {
              let message = str + " " + greeting
              print(message)
    }
    

    声明的时候用的?需要加上!

    let str:String? = "Hello"
            let greeting = "World!"
            if str != nil {
                let message = str! + " " + greeting
                print(message)
     }
    

    ??是取两个中不为nil的

    let helloStr:String? = nil
    let x = helloStr ?? "Hello World!"
    print(x)
    

    相关文章

      网友评论

          本文标题:Swift中? 、! 和 ??

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