首先,Swift 编程语言指南不是 ISO 9899 定义 C 的语言规范。(即使给出了 ISO 标准,也不是每个编译器都以相同的方式实现 C,甚至 100% 符合标准。)如果你发现编译器和文档之间的分歧,它很可能是文档错误和编译器错误。
也就是说,我相信您已经忽略了您引用的规范的一个重要部分:
AnyObject 也可以用作桥接到 Objective-C 类的类型实例的具体类型。Swift 中的许多值类型都连接到 Objective-C 对应物,例如 String 和 Int。
() -> Void
等价于,它作为一个(参见和)dispatch_block_t
连接到 ObjC :dispatch_object
dispatch/object.h
os/object.h
/*
* By default, dispatch objects are declared as Objective-C types when building
* with an Objective-C compiler. This allows them to participate in ARC, in RR
* management by the Blocks runtime and in leaks checking by the static
* analyzer, and enables them to be added to Cocoa collections.
* See <os/object.h> for details.
*/
OS_OBJECT_DECL_CLASS(dispatch_object);
所以这里() -> Void
可以强制进去也就不足为奇了AnyObject
。
在实践中,现在几乎任何东西都可以桥接AnyObject
(同样,从语言规范的角度来看,任何可以是 an 的东西都NSValue
可以是 an AnyObject
,尽管它的实现方式并不完全如此)。
AnyObject
然而,不同于Any
。Any
表现得像一个协议(尽管不是一个协议)。AnyObject
表现得像每个类的超类(尽管实际上是一个协议)。
let b = true // true
let bany = true as Any // true
let banyobj = true as AnyObject // 1 <=== (because it's NSNumber)
MemoryLayout.size(ofValue: b) // 1 (size of a bool)
MemoryLayout.size(ofValue: bany) // 32 (size of a protocol box)
MemoryLayout.size(ofValue: banyobj) // 8 (size of a reference pointer)
type(of: b) // Bool.Type
type(of: bany) // Bool.Type
type(of: banyobj) // __NSCFBoolean.Type
(尝试相同的方法{}
来查看如何处理闭包。)
针对AnyObject
文档打开缺陷以包含更明确的解释是任何类型都可以使用 转换为引用类型是合理的as AnyObject
,但这只是一个遗漏,而不是与已经存在的内容相矛盾。(如果这是一个矛盾,或者你觉得它令人困惑,那么正确的答案是打开一个缺陷来改进文档以匹配 Swift,而不是 Swift 以匹配文档。)