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