2015-11-26 53 views
3
let nilClosure: (() -> Void)? = nil 
let notNillable: AnyObject = nilClosure ?? 1 

爲什麼這不起作用?任何示例顯示如何讓無合併操作員使用閉包工作,表示讚賞。如何讓零合併操作員使用閉包工作?

我得到的錯誤是:

二元運算符 '?'不能應用於'(() - > Void)類型的操作數?和 '內部「'

+0

你會得到什麼樣的編譯器錯誤? –

回答

5

從蘋果的文檔:

的零合併運算(A?B)解開一個可選的一個,如果它 包含一個值,或返回默認值b,如果是零。該 表達是一個可選的類型始終。表達式b必須 匹配存儲內的類型。

需要注意的是最後一句......

即使那麼??運營商不適用於關閉。 即使這樣做,關閉也不符合AnyObject,因此不能分配給一個。

你可以這樣做:

enum OddObject { 
    case Closure(() -> Void) 
    case Value(Int) 
} 

let wrappedNilClosure: OddObject? = nil 
let oddObject = wrappedNilClosure ?? .Value(1) 

或者這樣:

let nilClosure: (() -> Void)? = nil 
let notNillable: Any = nilClosure != nil ? nilClosure! : { } 

這取決於什麼需要你正試圖填補。