31.13. 自身类型

Self 类型不是具体的类型,而是让你更方便的引用当前类型,不需要重复或者知道该类的名字。

在协议声明或者协议成员声明时,Self 类型引用的是最终遵循该协议的类型。

在结构体,类或者枚举值声明时,Self 类型引用的是声明的类型。在某个类型成员声明时,Self 类型引用的是该类型。在类成员声明时,Self 只能在以下几种情况中出现:

  • 作为方法的返回类型
  • 作为只读下标的返回类型
  • 作为只读计算属性的类型

在方法体中

举个例子,下面的代码演示了返回值是 Self 的实例方法 f

class Superclass {
    func f() -> Self { return self }
}
let x = Superclass()
print(type(of: x.f()))
// 打印 "Superclass"
class Subclass: Superclass { }
let y = Subclass()
print(type(of: y.f()))
// 打印 "Subclass"
let z: Superclass = Subclass()
print(type(of: z.f()))
// 打印 "Subclass"

上面例子的最后一部分表明 Self 引用的是值 z 的运行时类型 Subclass ,而不是变量本身的编译时类型 Superclass

在嵌套类型声明时,Self 类型引用的是最内层声明的类型。

Self 类型引用的类型和 Swift 标准库中 type(of:) 函数的结果一样。使用 Self.someStaticMember 访问当前类型中的成员和使用 type(of: self).someStaticMember 是一样的。

自身类型语法

self-type

自身类型Self

下一节:类型继承子句被用来指定一个命名型类型继承自哪个类、采纳哪些协议。类型继承子句开始于冒号 :,其后是类型标识符列表。