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