Swift 空合并运算符(Nil-Coalescing Operator)

目录

API

规则

举例

?? 跟if let 配合使用

注意事项


API

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

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

规则

  • a ?? b
  • a 是可选项
  • b 是可选项 或者 不是可选项
  • ba 的存储类型必须相同
  • 如果a不为nil ,就返回a
  • 如果anil,就返回b
  • 如果b不是可选项,返回a时会自动解包

举例

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语法要求时

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

注意事项

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

自从开始使用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的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值