扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模 )。扩展和 Objective-C 中的分类类似。
Swift 中的扩展可以:
- 添加计算型属性和计算型类型属性
- 定义实例方法和类型方法
- 提供新的构造器
- 定义下标
- 定义和使用新的嵌套类型
- 使一个已有类型符合某个协议
1.扩展语法
如果通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的。
extension SomeType { // 为 SomeType 添加的新功能写到这里 } //扩展类型时让类型遵守协议 extension SomeType: SomeProtocol, AnotherProctocol { // 协议实现写到这里 }
2.计算型属性
扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器
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; } var ft: Double { return self / 3.28084; } } let oneInch = 25.4.mm;
3.构造器
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 originX = center.x - (size.width / 2) let originY = center.y - (size.height / 2) self.init(origin: Point(x: originX, y: originY), size: size) } } let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size( 3.0, height: 3.0));
4.方法
extension Int { //扩展添加的方法 func repetitions(task: () -> Void) { for _ in 0..<self { task(); } } } //重要的事情说三遍..... 3.repetitions{ print("Goodbye!"); };
5.下标
extension Int { //扩展添加下标 subscript(digitIndex: Int) -> Int { var decimalBase = 1; for _ in 0..<digitIndex { decimalBase *= 10; } return (self / decimalBase) % 10; } } print("(123456[1])"); //"5 "
6.嵌套类型
extension Int { //嵌套的枚举类型Kind enum Kind { case Negative; case Zero; case Positive; } var kind: Kind { switch self { case 0: //0 return .Zero; case let x where x > 0: //正数 return .Positive; default: //负数 return .Negative; } } } print("((-3).kind)"); //"Negative "