跳到主要内容

Swift中的扩展

提示
  1. 扩展的定义和用途:在 Swift 中,使用 extension 关键字为现有类、结构体或枚举添加新功能。
  2. 扩展中的计算属性:虽然不能在扩展中添加存储属性,但可以添加计算属性来扩展功能。
  3. 协议扩展: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() 内声明的变量,用于存储转换结果。

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

// 使用类对象访问扩展方法
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()