Swift中? 、! 和 ??

时间:2022-07-23
本文章向大家介绍Swift中? 、! 和 ??,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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)