Self 是 Swift 中的一个类型占位符(Type Placeholder),它的意义取决于上下文,代表当前作用域中 “正在使用的类型”。
Self 表示“当前类型本身”,可以用于类、结构体、枚举的定义和方法内部,用来代指自己。
Self含义
1、类型级别(Type-level) —— 当前类型的别名
在类型的 static 方法或实例方法内部使用 Self,它代表“定义该方法的类型本身”。
例如:
class Dog {
static func create() -> Self {
return Self() // Self == Dog
}
required init() {}
}
这里的 Self 表示 Dog 类型,所以 create() 返回 Dog 的实例。
适用于:class、struct、enum 中访问 static let、static func、init()。
2、协议中的 Self(更复杂) —— 表示“遵循者的具体类型”
protocol Animal {
func clone() -> Self
}
这里的 Self 并不是指 Animal 协议本身,而是指“具体遵循这个协议的类型”。
struct Cat: Animal {
func clone() -> Self {
return self
}
}
Self 在这个上下文中指的是 Cat,而不是 Animal。
上下文的区别
1、类/结构体/枚举内部:Self表示当前类型本身,例如Self.callback, Self.init();
2、协议中:Self表示实现该协议的具体类型,例如func copy() -> Self;
3、实例方法中访问类型属性:Self.propertyName,例如访问 static let;
4、类型约束中 Self:Self表示当前泛型类型,例如func foo<T: Equatable>(_ a: T) where T == Self。
使用场景
1、在类中访问静态属性
class A {
static let typeName = "A"
func printType() {
print(Self.typeName) // Self == A
}
}
2、协议中的 Self 要求返回自身类型
protocol Copyable {
func copy() -> Self
}
3、使用 Self 作为返回类型创建链式 API
class Builder {
func setValue(_ v: Int) -> Self {
// ...
return self
}
}
Self 让子类重写 setValue() 时仍保留返回子类类型。
总结
在实际的应用中,存在self和Self的区别,self表示当前对象,Self表示当前类型本身(类、结构、枚举、协议中):
class A {
static let V1 = 1
let V2 = 1
func test() {
print(self.V1) // ❌ 编译错误
print(Self.V1) // ✅ 正确
print(self.V2) // ✅ 正确
print(Self.V2) // ❌ 编译错误
}
}
通过这里的代码,可以看到V1是静态变量,只有Self作为类型本身,访问V1是正确的。而v2是对象的属性,只有self才能正确访问,这就是根本的区别。