let f:() -> Void = { }
let array = ["a", 1, false, f] as [Any]
if array[3] is AnyObject {
print(array[3])
}
爲什麼元素爲AnyObject計算爲true,即使數組設置爲存儲Any?數組存儲任何對象也是AnyObject類型
爲什麼函數作爲AnyObject評估爲true,即使按定義AnyObject只能是類?
作爲另一個例子:
let f:() -> Bool = { return true }
let ff = f as AnyObject
(ff as() -> Bool)()
這違背在API doc的AnyObject的定義,其中指出:
AnyObject可以用作具體類型爲任何 的一個實例類,類類型或僅類的協議。
或官方Swift Programming Language Guide:
•任何可以在所有代表任何類型的實例,包括功能 類型。
•AnyObject可以表示任何類類型的實例。
在上面的例子中,它看起來像函數可以表示爲AnyObject。
SO中有其他地方的解釋(正如@hamish所指出的那樣),因爲在內部使用SwiftValue類,任何東西都可以橋接到AnyObject。解釋的邏輯似乎是有缺陷的/反向的,因爲我們應該使實現符合語言定義,而不是其他方式,所以要麼實現不正確,要麼AnyObject和類型檢查運算符的定義不正確?
因爲* everything *是可橋接的到Swift 3中的'AnyObject'。參見[AnyObject不能在Xcode8 beta6中工作?](http://stackoverflow.com/q/39033194/2976878) – Hamish
爲什麼以及如何將函數橋接到AnyObject?那不會打破AnyObject的定義嗎?即使可能,這種行爲似乎也是錯誤的。 – Boon
閱讀鏈接的問答 - 直接與Obj-C不兼容的東西被裝箱在Objc-C兼容框中_SwiftValue。推理原因是因爲'id'現在被連接到Swift作爲'Any',所以'Any'需要可橋接回'id'。 – Hamish