Swift 空合并运算符(Nil-Coalescing Oper

2021-03-28  本文已影响0人  搬码小能手

可选项的本质是enum类型

API


public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?

public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T

规则

举例

let a: Int? = 1
let b: Int? = 2
let c = a ?? b // let c: Int? Optional(1)
let a: Int? = nil
let b: Int? = 2
let c = a ?? b //let c: Int? Optional(2)
let a: Int? = nil
let b: Int? = nil
let c = a ?? b //let c: Int? , nil
let a: Int? = 1
let b: Int = 2
let c = a ?? b //let c: Int , 1
let a: Int? = nil
let b: Int = 2
let c = a ?? b // let c: Int , 2

?? 跟if let 配合使用

let a: Int? = nil
let b: Int? = 2

if let c = a ?? b {
  print(c)
}
当不符合if let语法要求时.png

这样做的好处是,当你不清楚b的类型的时候,编译器如果报错,说明b不是可选类型
因为既然使用if let 语法,a ?? b 的值必须是可选类型,那么也就说明,b必须是可选类型

注意事项(纯Swift不用考虑,swift是安全的语言。Objective-CSwift混编要注意)

自从开始使用swift写项目的时候,更加注意数据类型,不然会引起严重bug!

举例

在纯swift开发的过程中,一般不会出现数据类型出错,因为系统可以检测出数据类型不一致,无法编译通过。

SwiftObjective-C 混编的时候,Objective-C是没有可选类型这个概念的
如果把Objective-CNSString类型直接赋给Swift中的String类型的时候,编译器是不会报错的!

Objective-CNSString的值为nil的时候,问题就出现了,这个时候Swift中的String类型就无法接受nil
而且更可怕的是,这个时候编译器是不会报错的!!!

所以,在遇到swift类型接收Objective-C类型的时候,一定要确认Objective-C的数据类型。

如果Objective-C定义数据类型,没有设置nonnull,此时Objective-C的数据类型是允许为nil的

image.png
上一篇下一篇

猜你喜欢

热点阅读