扩展(Extension)
扩展:就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模)。扩展和 Objective-C 中的分类类似(与 Objective-C 不同的是,Swift 的扩展没有名字)
扩展作用
1、可以添加计算型属性和计算型类型属性
2、可以定义实例方法和类型方法
3、可以提供新的构造器
4、可以定义下标
5、可以定义和使用新的嵌套类型
6、可以使一个已有类型符合某个协议
扩展语法:
使用关键字 extension 来声明扩展
extension SomeType {
// 为 SomeType 添加的新功能写到这里
}
可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议。在这种情况下,无论是类还是结构体,协议名字的书写方式完全一样
extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这里
}
如果你通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的。
计算型属性扩展
扩展可以为已有类型添加计算型实例属性和计算型类型属性。但是不可以添加存储型属性,也不可以为已有属性添加属性观察器。
extension Double {
var cm: Double {
return self / 100.0
}
}
方法扩展
扩展可以为已有类型添加新的实例方法和类型方法。
extension Int {
func sum(_ num: Int) -> Int {
return self + num
}
}
构造器扩展:
扩展可以为已有类型添加新的构造器。这可以让你扩展其它类型,将你自己的定制类型作为其构造器参数,或者提供该类型的原始实现中未提供的额外初始化选项。
扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。
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)
}
}
下标扩展
扩展可以为已有类型添加新下标
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex
decimalBase *=10
}
return (self / decimalBase) % 10
}
}
746381295[0] // 返回 5
746381295[1] // 返回 9
746381295[2] // 返回 2
746381295[8] // 返回 7
嵌套类型扩展
扩展可以为已有的类、结构体和枚举添加新的嵌套类型
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
}}
}
func printIntegerKinds(_ numbers: [Int]) {
for number in numbers {
switch number.kind {
case .Negative:
print("- ", terminator: "")
case .Zero:
print("0 ", terminator: "")
case .Positive:
print("+ ", terminator: "")
}
}
print("")
}
printIntegerKinds([3, 19, -27, 0, -6, 0, 7]) // 打印 + + - 0 - 0 +