阅读 31

空合运算符 ?? 解析

介绍

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}
复制代码

就很不优雅了。

关注下面的标签,发现更多相似文章
评论