在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
類型的block
。code
若是去掉@autoclosure
須要這麼寫:繼承
let a = b ?? {c}
複製代碼
就很不優雅了。