介绍
在swift中定义了一个新的短路运算符:空合运算符(Nil Coalescing Operator)写作??。用于判空处理,如果左侧为空则取右侧值。
代码
??运算符定义在Policy.swift文件中。
infix operator ??: NilCoalescingPrecedence
可以看到??是一个中置运算符,继承自NilCoalescingPrecedence优先级组。
查看NilCoalescingPrecedence:
precedencegroup NilCoalescingPrecedence {
associativity: right
higherThan: ComparisonPrecedence
}
可以发现NilCoalescingPrecedence是右结合的,优先级高于ComparisonPrecedence。
??方法实现在Optional.swift 文件中:
public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?)
rethrows -> T? {
switch optional {
case .some(let value):
return value
case .none:
return try defaultValue()
}
}
因为defaultValue是否执行取决于左侧optional是否有值,所以需要延迟执行,否则参数会被默认执行一次,造成潜在bug。
可以使用闭包来做延迟操作,使用@autoclosure系统会帮我们自动封装成闭包,可以简化闭包调用。
@autoclosure也只支持() -> T类型的block。
如果去掉@autoclosure需要这么写:
let a = b ?? {c}
就很不优雅了。