关键字 self
#
在 Swift 中,关键字 self
有多种用途,主要用于引用当前实例、属性或方法。下面是 self
的几种常见用途:
1. 引用当前实例 #
- 在类或结构体的方法中,可以使用
self
来引用当前实例。
class Person {
var name: String
init(name: String) {
self.name = name
}
func greet() {
print("Hello, my name is \(self.name)")
}
}
2. 区分属性和参数 #
- 当实例的属性名与参数名相同时,可以使用
self
来区分它们。
class Point {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
func setCoordinates(x: Int, y: Int) {
self.x = x
self.y = y
}
}
3. 避免闭包循环引用 #
- 在闭包内部引用当前实例时,可以使用
self
来避免循环引用。
class MyClass {
var closure: (() -> Void)?
func setupClosure() {
self.closure = {
self.doSomething()
}
}
func doSomething() {
print("Doing something")
}
}
4. 在闭包中弱化引用 #
- 在闭包中捕获
self
并使用弱引用来避免循环引用。
class SomeClass {
var closure: (() -> Void)?
func setupClosure() {
self.closure = { [weak self] in
self?.doSomething()
}
}
func doSomething() {
print("Doing something")
}
}
总结 #
self
是一个特殊的关键字,用于引用当前实例、区分属性和参数、避免循环引用以及在闭包内部使用。- 在大多数情况下,Swift 会自动推断
self
的引用,因此在许多情况下,可以省略self
关键字。
关键字 Self
#
在 Swift 中,Self
是一个类型别名,用于引用当前类型。它主要用于泛型和协议中,能够使代码更具灵活性和复用性。
1. 协议中的 Self #
在协议中,Self
用于表示遵循该协议的具体类型。这意味着在定义协议时,可以使用 Self
来指代具体的实现类型。这对于定义返回自身类型的方法非常有用。
protocol Clonable {
func clone() -> Self
}
class Person: Clonable {
var name: String
init(name: String) {
self.name = name
}
func clone() -> Self {
return Person(name: self.name) as! Self
}
}
let original = Person(name: "John")
let clone = original.clone()
print(clone.name) // 输出: John
在这个例子中,Clonable
协议定义了一个 clone
方法,返回类型为 Self
。具体实现这个协议的类(如 Person
)中的 clone
方法返回的实际类型也是 Person
,保持了类型的一致性。
2. 类和结构体中的 Self #
在类和结构体中,Self
可用于表示当前类型,尤其在泛型和动态类型中使用。
class Vehicle {
class func create() -> Self {
return self.init()
}
required init() {
// 初始化代码
}
}
class Car: Vehicle {
var model: String = "Sedan"
required init() {
super.init()
}
}
let myCar = Car.create()
print(type(of: myCar)) // 输出: Car
在这个示例中,Vehicle
类有一个类方法 create
,返回类型是 Self
。通过调用 self.init()
,create
将返回调用它的具体类型的实例。
3. 泛型中的 Self #
在泛型上下文中,Self
能够创建与当前对象类型一致的返回类型。
protocol Initializable {
init()
}
extension Initializable {
static func createInstance() -> Self {
return Self.init()
}
}
struct MyStruct: Initializable {
var value: Int = 10
}
let instance = MyStruct.createInstance()
print(type(of: instance)) // 输出: MyStruct
在这个例子中,Initializable
协议要求实现 init()
初始化方法,并在扩展中定义了一个返回类型为 Self
的静态方法 createInstance
。最终,MyStruct
作为具体类型实现了该协议,并通过 createInstance
方法生成了与 MyStruct
类型一致的实例。
官方文档 #
你可以在 Swift 的官方文档中找到更多关于 Self
的内容: