Swift:对 AnyObject 声明感到困惑
Swift: Confused about AnyObject declaration
我知道 AnyObject 可以是任何 class 类型,但我对 AnyObject 的声明感到困惑,我读过一本书和一些文章说它是一个协议,但是当我查看 AnyObject声明它告诉我它是一个 typealias AnyObject 而不是一个协议,如果我们假设 typealias AnyObject 被分配给了一些协议(例如:typealias AnyObject = some protocols here)我看不到 typealias AnyObject 被分配给了哪些协议,请帮助。
以前,Swift.AnyObject
是在 Policy.swift
中定义的一个空协议,编译器知道。 On April 13, 2017, Slava Pestov changed it 到当前的 typealias
并从编译器中删除了 Swift.AnyObject
的知识。
目前,Swift.AnyObject
是标准库源代码中的typealias
、declared in Policy.swift
:
public typealias AnyObject = Builtin.AnyObject
Builtin
是一个特殊的模块,包含编译器内置的类型和函数。 Builtin
模块的成员不必在 Swift 中声明。普通源代码无法直接访问 Builtin
模块。标准库以特殊的编译器模式编译,使其可以访问 Builtin
模块。
编译器处理Builtin.AnyObject
类型in swift::getBuiltinType
in lib/AST/Builtins.cpp
:
// AnyObject is the empty class-constrained existential.
if (Name == "AnyObject")
return CanType(
ProtocolCompositionType::get(Context, {},
/*HasExplicitAnyObject=*/true));
所以 Builtin.AnyObject
是(有点自相矛盾的)协议组合,不包含任何协议作为成员(即 {}
参数),并标记为引用类型(即 true
参数)。
什么是“协议组合”?在Swift中,你可以声明一个变量的类型是多个协议放在一起:
protocol P { }
protocol Q { }
var v: P & Q // v's type is the composition of protocols P and Q
无法用 Swift 语言编写空协议组合(不包含协议的组合)。
我知道 AnyObject 可以是任何 class 类型,但我对 AnyObject 的声明感到困惑,我读过一本书和一些文章说它是一个协议,但是当我查看 AnyObject声明它告诉我它是一个 typealias AnyObject 而不是一个协议,如果我们假设 typealias AnyObject 被分配给了一些协议(例如:typealias AnyObject = some protocols here)我看不到 typealias AnyObject 被分配给了哪些协议,请帮助。
以前,Swift.AnyObject
是在 Policy.swift
中定义的一个空协议,编译器知道。 On April 13, 2017, Slava Pestov changed it 到当前的 typealias
并从编译器中删除了 Swift.AnyObject
的知识。
目前,Swift.AnyObject
是标准库源代码中的typealias
、declared in Policy.swift
:
public typealias AnyObject = Builtin.AnyObject
Builtin
是一个特殊的模块,包含编译器内置的类型和函数。 Builtin
模块的成员不必在 Swift 中声明。普通源代码无法直接访问 Builtin
模块。标准库以特殊的编译器模式编译,使其可以访问 Builtin
模块。
编译器处理Builtin.AnyObject
类型in swift::getBuiltinType
in lib/AST/Builtins.cpp
:
// AnyObject is the empty class-constrained existential. if (Name == "AnyObject") return CanType( ProtocolCompositionType::get(Context, {}, /*HasExplicitAnyObject=*/true));
所以 Builtin.AnyObject
是(有点自相矛盾的)协议组合,不包含任何协议作为成员(即 {}
参数),并标记为引用类型(即 true
参数)。
什么是“协议组合”?在Swift中,你可以声明一个变量的类型是多个协议放在一起:
protocol P { }
protocol Q { }
var v: P & Q // v's type is the composition of protocols P and Q
无法用 Swift 语言编写空协议组合(不包含协议的组合)。