以下是??
操作符的聲明
public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?
可以看到,
defaultValue
是一個@autoclosure
類型的參數。所以我們可以傳入一個表達式。Swift的??
為什么要這么聲明呢?T直接作為值返回不就行了?
原因:
在 The Swift Programming Language空合運算符有一個解釋。
NOTE
a ?? b
If the value of a is non-nil, the value of b is not evaluated. This is known as short-circuit evaluation.
及當a為非空值(non-nil)的時候,b將不會被計算,這也就是所謂的短路求值。
那么我們就明白了,為什么defaultValue
要被聲明為一個@autoclosure
。
當T為一個常量的時候,defaultValue
是否被聲明為@autoclosure
其實我所謂。但是當你的T是由一個復雜的計算得到的話,這時候@autoclosure
就相當的有必要了。
因為T如果是由一個復雜的計算得到的話,那么我們在寫之前就需要計算出T的值來,但是如果optional
的值又不為空,那么剛才所求出來的值T就沒什么用,計算的開銷就被白白浪費掉。
所以,聲明為@autoclosure
可以避免這種情況,及當optional
被判定為nil
的時候,我們再去計算defaultValue
里面的值T。這樣我們就避免了不必要的開銷。
Demo:
var num1: Int?
var num2: Int = 0
func defaultResult() -> Int {
return 1 + 2 * 3 + 5 - 13
}
num2 = num1 ?? defaultResult()
num2 = num1 ?? (1 + 2 * 3 + 5 - 13)
另:
public static func &&(lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool
public static func ||(lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool