Swift中? 、! 和 ??

2020-08-17 16:03:14 浏览数 (1)

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

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

代码语言:javascript复制
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来判断:

代码语言:javascript复制
if name { 
// 有值再操作
}

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

? 的使用场景:

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

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

代码语言:javascript复制
var person:Person?
var str:String?
var num:NSNumber!

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

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

代码语言:javascript复制
 let str:String! = "Hello"
        let greeting = "World!"
        if str != nil {
          let message = str   " "   greeting
          print(message)
}

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

代码语言:javascript复制
let str:String? = "Hello"
        let greeting = "World!"
        if str != nil {
            let message = str!   " "   greeting
            print(message)
 }

??是取两个中不为nil的

代码语言:javascript复制
let helloStr:String? = nil
let x = helloStr ?? "Hello World!"
print(x)

0 人点赞