Swift 扩展
Swift 中的扩展(Extensions)允许你向已有的类、结构体、枚举类型和协议添加新功能,而不需要修改它们的源代码。这是 Swift 非常强大的一个特性,因为它可以帮助你遵循面向对象编程中开放/封闭原则(对扩展开放,对修改封闭)。
扩展可以做些什么?
添加计算属性和计算型类型属性:
扩展能够为现有类型添加计算属性,但不能添加存储属性或属性观察者。extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
}
let oneKm = 1.km // 返回 1000.0
定义实例方法和类型方法:
可以为现有的类型添加新的实例方法和类型方法。extension Int {
func repetitions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}
3.repetitions {
print("Hello!")
}
提供新的构造器:
扩展可以为已有类型添加新的便利构造器,但不能为类添加指定构造器或析构器。struct Size {
var width = 0.0, height = 0.0
}
extension Size {
init(side: Double) {
self.width = side
self.height = side
}
}
let square = Size(side: 10.0)
定义下标:
扩展可以为已有类型添加新下标。extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
746381295[0] // 返回 5
嵌套类型:
扩展可以为已有的类、结构体和枚举类型添加新的嵌套类型。
使用扩展的注意事项
- 扩展可以在多文件中实现一个类型的定义,这可以提升代码的可读性和组织性。
- 如果扩展添加了遵循新的协议,协议的方法实现可以被分布到扩展中。
- 扩展不能加存储属性,也不能重写已有类的功能。在继承体系中,需要通过子类化才能重写功能。
扩展是 Swift 语言中功能强大且灵活的一部分,非常适合灵活地为已有类添加功能而不影响原有代码。