扩展就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模)。扩展和 Objective-C 的分类类似。(与 Objective-C 不同的是,Swift 的扩展没有名字。)
swift 中的扩展可以:
添加计算型属性和计算型类型属性
定义实例方法和类型方法
提供新的构造器
定义下标
定义和使用新的嵌套类型
使一个已有类型符合某个协议
在 swift 中,你甚至可以对协议进行扩展,提供协议要求的实现,或者添加额外的功能,从而可以让符合协议的类型拥有这些功能。你可以从协议扩展中获取更多的细节。
注意
扩展可以为一个类型添加新的功能,但是不能重写已有的功能。
扩展语法
使用关键子 extension 来声明扩展:
extension SomeType {
// 为 SomeType 添加的新功能写在这里
}
可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议。在这种情况下,无论是类还是结构体,协议名字的书写方式都是一样的。
extension SomeType: SomeProtocol,AnotherProtocol {
// 协议实现写在这里
}
通过这种方式添加协议一致性的详细描述可参考扩展添加协议一致性。
注意:
如果你通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的。
计算型属性
扩展可以为已有类型添加计算型实例属性和计算型类型属性。下面的例子为 swift 的内建 Double 类型添加了五个计算型实例属性,从而提供与距离单位协作的基本支持:
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
print("One inckh is \(oneInch) meters")
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
这些计算型属性表达的含义是把一个 Double 值看作是某单位下的长度值。即使它们被实现为计算型属性,但这些属性的名字仍可紧接一个浮点型字面值,从而通过点语法来使用,并以此实现距离转换。