Swift中的扩展
提示
- 扩展的定义和用途:在 Swift 中,使用
extension
关键字为现有类、结构体或枚举添加新功能。 - 扩展中的计算属性:虽然不能在扩展中添加存储属性,但可以添加计算属性来扩展功能。
- 协议扩展:Swift 允许扩展协议,提供默认实现或添加新方法,从而增强协议的功能。
在 Swift 中,我们可以为现有类型添加新的功能。我们可以通过使用**扩展(extension)**来实现这一点。
我们使用 extension
关键字来声明一个扩展。例如,
// 类定义
class Temperature {
...
}
// Temperature 类的扩展
extension Temperature {
// 添加新方法
}
在这里,我们使用 extension
关键字为 Temperature
类创建了一个扩展。
现在,在扩展内部,我们可以为 Temperature
添加新的功能。
例子:Swift 扩展
// 类定义
class Temperature {
var celsius: Double = 0
func setTemperature(celsius: Double) {
self.celsius = celsius
print("摄氏温度:", celsius)
}
}
// 声明一个扩展
extension Temperature {
// 向 Temperature 类添加新方法
func convert() {
var fahrenheit = (celsius * 1.8) + 32
print("华氏温度:", fahrenheit)
}
}
// 类初始化
let temp1 = Temperature()
temp1.setTemperature(celsius: 16)
// 使用类对象访问扩展方法
temp1.convert()
输出
摄氏温度: 16.0
华氏温度: 60.8
在上面的例子中,我们为 Temperature
类创建了一个扩展。
extension Temperature {
// 向 Temperature 类添加新方法
func convert() {
var fahrenheit = (celsius * 1.8) + 32
...
}
这个扩展为 Temperature
添加了以下功能:
convert()
- 一个将温度从摄氏度转换为华氏度的方法。fahrenheit
- 在convert()
内声明的变量,用于存储转换结果。
然后,我们创建了一个名为 temp1
的 Temperature
对象,并使用它来访问扩展内创建的方法。
// 使用类对象访问扩展方法
temp1.convert()
注意:类内定义的属性(如 celsius
)也可以在扩展中使用。
扩展中的计算属性
在 Swift 中,我们不能在扩展中添加存储属性。例如,
extension Circle {
// 存储属性
var radius: Int // 错误代码
}
然而,Swift 允许我们在扩展中添加计算属性。例如,
extension Circle {
// 计算属性
var area: Double {
...
}
}
这里,area
是在 extension
体内定义的计算属性。
例子:扩展中的计算属性
class Circle {
var radius: Double = 0
}
extension Circle {
// 定义计算属性
var area: Double {
return 3.14 * radius * radius
}
}
let circle1 = Circle()
circle1.radius = 5
print("面积:", circle1.area)
输出
面积: 78.5
在上面的例子中,我们为 Circle
类创建了一个 extension
,其中定义了名为 area
的计算属性。
这个属性根据 radius
的值计算圆的面积。
var area: Double {
return 3.14 * radius * radius
}
协议扩展
在 Swift 中,我们也可以扩展协议。例如,
// 协议定义
protocol Brake {
func applyBrake()
}
// 扩展协议
extension Brake {
func applyBrake() {
print("刹车已应用")
}
}
// 定义符合 Brake 的类
class Car: Brake {
var speed: Int = 0
}
let car1 = Car()
car1.speed = 61
print("速度:", car1.speed)
// 访问扩展的协议
car1.applyBrake()
输出
速度:61
已应用刹车
在上面的示例中,我们创建了名为 Brake
的协议,该协议定义了 applyBrake()
函数。
我们扩展了 Brake
协议,并在其内部定义了 applyBrake()
函数的主体。
// 扩展协议
extension Brake {
func applyBrake() {
print("已应用刹车")
}
}
现在,由于 Car
类符合 Brake
协议
class Car: Brake {
...
}
我们可以使用 car1
对象访问扩展的协议。
// 访问扩展的协议
car1.applyBrake()