关键字 — 关键字 self 和 Self

关键字 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 的内容:

本文共 1049 字,上次修改于 Dec 25, 2024