空合運算符 ?? 解析

介紹

swift中定義了一個新的短路運算符:空合運算符(Nil Coalescing Operator)寫做??。用於判空處理,若是左側爲空則取右側值。git

代碼

??運算符定義在Policy.swift文件中。github

infix operator ??: NilCoalescingPrecedence
複製代碼

能夠看到??是一箇中置運算符,繼承自NilCoalescingPrecedence優先級組。swift

查看NilCoalescingPrecedence:bash

precedencegroup NilCoalescingPrecedence {
  associativity: right
  higherThan: ComparisonPrecedence
}
複製代碼

能夠發現NilCoalescingPrecedence是右結合的,優先級高於ComparisonPrecedence閉包

??方法實如今Optional.swift 文件中:app

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。ui

能夠使用閉包來作延遲操做,使用@autoclosure系統會幫咱們自動封裝成閉包,能夠簡化閉包調用。spa

@autoclosure也只支持() -> T類型的blockcode

若是去掉@autoclosure須要這麼寫:繼承

let a = b ?? {c}
複製代碼

就很不優雅了。

相關文章
相關標籤/搜索