Swift 扩展

在本教程中,我们将通过实例了解 Swift 扩展。

在 Swift 中,我们可以向现有类型添加新功能。我们可以使用扩展来实现这一点。

我们使用 extension 关键字来声明扩展。例如,

  1. // class definition
  2. class Temperature {
  3. ...
  4. }
  5. // extension of Temperature class
  6. extension Temperature {
  7. // add new methods
  8. }

在这里,我们使用 extension 关键字创建了 Temperature 类的扩展。

现在,在扩展中,我们可以向 Temperature 添加新功能。


实例:swift 扩展

  1. // class definition
  2. class Temperature {
  3. var celsius: Double = 0
  4. func setTemperature(celsius: Double) {
  5. self.celsius = celsius
  6. print("Celsius:", celsius)
  7. }
  8. }
  9. // declare an extension
  10. extension Temperature {
  11. // add a new method to Temperature class
  12. func convert() {
  13. var fahrenheit = (celsius * 1.8) + 32
  14. print("Fahrenheit:", fahrenheit)
  15. }
  16. }
  17. // class initialization
  18. let temp1 = Temperature()
  19. temp1.setTemperature(celsius: 16)
  20. // access extension method using class object
  21. temp1.convert()

结果如下:

  1. Celsius: 16.0
  2. Fahrenheit: 60.8

在上面的实例中,我们创建了 Temperature 类的扩展。

  1. extension Temperature {
  2. // add a new method to Temperature class
  3. func convert() {
  4. var fahrenheit = (celsius * 1.8) + 32
  5. ...
  6. }
  7. }

此扩展将以下功能添加到 Temperature

  • convert() - 一种简单地将温度从摄氏度转换为华氏度的方法。

  • fahrenheit - 在 convert() 内声明的变量,用于存储转换结果。

然后,我们创建了一个名为 Temperaturetemp1 对象,并使用它访问在扩展内创建的方法。

  1. // access extension method using class object
  2. temp1.convert()
注意:类内定义的属性(如 celsius)也可以在扩展内使用。

扩展中的计算属性

在 Swift 中,我们无法在扩展中添加存储的属性。例如,

  1. extension Circle {
  2. // stored property
  3. var radius: Int // error code
  4. }

然而,Swift 让我们可以将 计算属性 添加到扩展中。例如,

  1. extension Circle {
  2. // computed property
  3. var area: Double {
  4. ...
  5. }
  6. }

这里,area 是在 extension 主体中定义的计算属性。

实例:扩展中的计算属性
  1. class Circle {
  2. var radius: Double = 0
  3. }
  4. extension Circle {
  5. // define computed property
  6. var area: Double {
  7. return 3.14 * radius * radius
  8. }
  9. }
  10. let circle1 = Circle()
  11. circle1.radius = 5
  12. print("Area:", circle1.area)

结果如下:

  1. Area: 78.5

在上面的实例中,我们创建了 Circle 类的扩展,其中定义了一个名为 area 的计算属性。

此特性基于 radius 半径值计算圆的面积。

  1. var area: Double {
  2. return 3.14 * radius * radius
  3. }

协议扩展

在 Swift 中,我们还可以扩展协议。例如,

  1. // protocol definition
  2. protocol Brake {
  3. func applyBrake()
  4. }
  5. // extend protocol
  6. extension Brake {
  7. func applyBrake() {
  8. print("Brake Applied")
  9. }
  10. }
  11. // define class that conforms Brake
  12. class Car: Brake {
  13. var speed: Int = 0
  14. }
  15. let car1 = Car()
  16. car1.speed = 61
  17. print("Speed:", car1.speed)
  18. // access extended protocol
  19. car1.applyBrake()

结果如下:

  1. Speed: 61
  2. Brake Applied

在上面的实例中,我们创建了定义函数 applyBrake() 的协议 Brake

我们已经扩展了 Brake 协议,并在其中定义了 applyBrake() 函数体。

  1. // extend protocol
  2. extension Brake {
  3. func applyBrake() {
  4. print("Brake Applied")
  5. }
  6. }

现在,由于 Car 类符合 Brake 协议。

  1. class Car: Brake {
  2. ...
  3. }

我们可以使用 car1 对象访问扩展协议。

  1. // access extended protocol
  2. car1.applyBrake()