Swift 扩展
在本教程中,我们将通过实例了解 Swift 扩展。
在 Swift 中,我们可以向现有类型添加新功能。我们可以使用扩展来实现这一点。
我们使用 extension 关键字来声明扩展。例如,
// class definitionclass Temperature {...}// extension of Temperature classextension Temperature {// add new methods}
在这里,我们使用 extension 关键字创建了 Temperature 类的扩展。
现在,在扩展中,我们可以向 Temperature 添加新功能。
实例:swift 扩展
// class definitionclass Temperature {var celsius: Double = 0func setTemperature(celsius: Double) {self.celsius = celsiusprint("Celsius:", celsius)}}// declare an extensionextension Temperature {// add a new method to Temperature classfunc convert() {var fahrenheit = (celsius * 1.8) + 32print("Fahrenheit:", fahrenheit)}}// class initializationlet temp1 = Temperature()temp1.setTemperature(celsius: 16)// access extension method using class objecttemp1.convert()
结果如下:
Celsius: 16.0Fahrenheit: 60.8
在上面的实例中,我们创建了 Temperature 类的扩展。
extension Temperature {// add a new method to Temperature classfunc convert() {var fahrenheit = (celsius * 1.8) + 32...}}
此扩展将以下功能添加到 Temperature:
convert()- 一种简单地将温度从摄氏度转换为华氏度的方法。fahrenheit- 在convert()内声明的变量,用于存储转换结果。
然后,我们创建了一个名为 Temperature 的 temp1 对象,并使用它访问在扩展内创建的方法。
// access extension method using class objecttemp1.convert()
注意:类内定义的属性(如
celsius)也可以在扩展内使用。扩展中的计算属性
在 Swift 中,我们无法在扩展中添加存储的属性。例如,
extension Circle {// stored propertyvar radius: Int // error code}
然而,Swift 让我们可以将 计算属性 添加到扩展中。例如,
extension Circle {// computed propertyvar area: Double {...}}
这里,area 是在 extension 主体中定义的计算属性。
实例:扩展中的计算属性
class Circle {var radius: Double = 0}extension Circle {// define computed propertyvar area: Double {return 3.14 * radius * radius}}let circle1 = Circle()circle1.radius = 5print("Area:", circle1.area)
结果如下:
Area: 78.5
在上面的实例中,我们创建了 Circle 类的扩展,其中定义了一个名为 area 的计算属性。
此特性基于 radius 半径值计算圆的面积。
var area: Double {return 3.14 * radius * radius}
协议扩展
在 Swift 中,我们还可以扩展协议。例如,
// protocol definitionprotocol Brake {func applyBrake()}// extend protocolextension Brake {func applyBrake() {print("Brake Applied")}}// define class that conforms Brakeclass Car: Brake {var speed: Int = 0}let car1 = Car()car1.speed = 61print("Speed:", car1.speed)// access extended protocolcar1.applyBrake()
结果如下:
Speed: 61Brake Applied
在上面的实例中,我们创建了定义函数 applyBrake() 的协议 Brake。
我们已经扩展了 Brake 协议,并在其中定义了 applyBrake() 函数体。
// extend protocolextension Brake {func applyBrake() {print("Brake Applied")}}
现在,由于 Car 类符合 Brake 协议。
class Car: Brake {...}
我们可以使用 car1 对象访问扩展协议。
// access extended protocolcar1.applyBrake()