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是标准库源代码中的typealiasdeclared 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 语言编写空协议组合(不包含协议的组合)。