Swift类型占位符Self
Swift类型占位符Self

Swift类型占位符Self

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才能正确访问,这就是根本的区别。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注