扩展
扩展可以给一个现有的类,结构体,枚举,还有协议添加新的功能。它还拥有不需要访问被扩展类型源代码就能完成扩展的能力(即逆向建模)。
扩展可以为现有的类型添加新的功能,但不能重写已有功能。
扩展可以
- 添加计算实例属性和计算类型属性
- 定义实例方法和类方法
- 提供新的构造器
- 定义下标
- 定义和使用新的嵌套类型
- 使已经存在的类型遵循(
conform)一个协议
使用 extension 关键字声明扩展:
swift
extension SomeType {
// 在这里给 SomeType 添加新的功能
}扩展属性
在扩展中,你可以添加新的计算属性,但是你不能添加存储属性,也不能为现有的属性添加属性观察者。这是因为扩展不能添加新的存储空间,只能扩展新的计算方式。
示例:
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 }
}这个扩展为 Double 类型添加了几个计算属性,用于将一个数字从米转换为其他长度单位。
扩展构造器
示例:
swift
extension CGRect {
init(centerX: CGFloat, centerY: CGFloat, width: CGFloat, height: CGFloat) {
let originX = centerX - width / 2
let originY = centerY - height / 2
self.init(x: originX, y: originY, width: width, height: height)
}
}这个扩展为 CGRect 添加了一个新的便利构造器,允许初始化时直接设置矩形的中心点。
扩展方法
示例:
swift
extension Int {
func repetitions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}这个扩展为 Int 添加了一个新的方法,允许执行某任务多次,次数由整数决定。
扩展下标
示例:
swift
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}这个扩展为 Int 类型添加了一个下标,允许查询数值的指定位置的数字。
扩展嵌套类型
示例:
swift
extension Int {
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0:
return .positive
default:
return .negative
}
}
}这个扩展为 Int 添加了一个嵌套枚举和一个新的计算属性,用于判断数字是正数、零还是负数。