前言 本篇将详细总结介绍Swift扩展的用法:
extension 的能力
可以添加 计算型实例属性
和 计算型类型属性
。
可以添加 实例方法和类型方法
可以添加 新的初始化器
可以添加 下标脚本
可以使现有的 类型遵循某协议
定义和使用 新内嵌类型
扩展 可以向一个类型添加新的方法
,但是不能重写已有的方法
使用注意:
不可以添加 存储属性
,也不可以为已有属性添加属性观察器
扩展中不能为 类
添加 新的构造器
,因为 新的构造器和结构器
必须由原始的类来实现
添加计算属性
扩展 不可以添加存储型属性,也不可以为已有属性添加属性观察器
1 2 3 4 extension Double{ // 注意:扩展不能扩展存储型属性 // var km: Double = 0.0 //报错 }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 extension Double { // 注意:扩展不能添加存储属性 // var km: Double = 0.0 // 计算属性 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 } var ft: Double { return self / 3.28084 } } let oneInch = 25.4 print("one inch is \(oneInch) meters") ===== one inch is 25.4 meters
添加初始化器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 struct Size { var width = 0.0, height = 0.0 } struct Point { var x = 0.0,y = 0.0 } struct Rect { var origin = Point() var size = Size() } extension Rect{ // 新的初始化器 init(center:Point, size:Size) { let origin_x = center.x - size.width/2 let origin_y = center.y - size.height/2 // 新的初始化器必须调用指定初始化器 self.init(origin:Point(x: origin_x, y: origin_y),size:size) } } let rect3 = Rect(center: Point(x:200, y:200), size: Size(width: 100, height: 100))
添加方法
扩展可以为 已有的类型
添加新的 实例方法和类方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // 添加方法 extension Int { // 实例方法 func repetions(task: () -> Void) { for _ in 0..<self { task() } } } 3.repetions { print("hello") } ====== hello hello hello
添加异变方法
1 2 3 4 5 6 7 8 9 10 11 extension Int { mutating func square() { self = self * self } } var someInt = 3 someInt.square() print(someInt) ======= 9
添加下标
被除数 ➗ 除数 = 商 …. 余数 示例:获取 12345 的第 3 位数 推导过程:被除数 ➗ 10^位数次方 = 商(前面的几位数)… 余数(剩下的几位数),如 12345 ➗ 10^3 = 123 …. 45 被除数 ➗ 10 = 第 3 位数,123 ➗ 10 = 12 …. 3 余数是3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 extension Int { subscript(index: Int) -> Int { var base = 1 for i in 0..<index { base *= 10 } return (self / base) % 10 } } print(746381295[0]) print(746381295[1]) print(746381295[2]) ============= 5 9 2
添加内嵌类型
扩展可以为已有的 类、结构体和枚举添加新的内嵌类型
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // 添加内嵌类型 extension Int { enum Kind { // 负数 0 正数 case neg,zero,pos } var kind: Kind { switch self { case 0: return .zero case let x where x > 0: return .pos default: return .neg } } } print(8.kind) print(0.kind) ======= pos zero
通过扩展集合类型Collection给的元素添加限制 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // 协议扩展添加约束条件 extension Collection where Element: Equatable { func allEqual() -> Bool { for element in self { if element != self.first { return false } } return true } } let equalNumbers = [100, 100, 100, 100, 100] let differentNumbers = [100, 100, 200, 100, 200] print(equalNumbers.allEqual()) print(differentNumbers.allEqual()) ======== true false