扩展

扩展就是为一个已有的类、结构体、枚举或者协议添加新功能。

Swift中的扩展

  • 添加计算型属性和计算型类型属性
  • 定义实例方法和类方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使一个已有类型符合某个协议

扩展语法

使用关键字 extension来声明扩展

1
2
3
extension SomeType {
// 为 SomeType扩展的新功能写到这里
}

通过扩展一个已有类型,使其采纳一个或多个协议

1
2
3
extension SomeType : SomeProtocol, AnotherProtocol {
//协议实现写到这里
}
计算型属性

扩展可以为已有类型添加计算型实例属性和计算型类型属性

1
2
3
4
5
6
7
8
9
10
extension Double {
var km: Double { return self * 1000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
var ft: Double { return self / 3.28084 }
}

let oneInch = 25.4.mm
let aMarathon = 42.km + 19.5m
构造器

扩展可以为已有类型添加新的构造器。扩展能为类添加新的便利构造器,但不能为类添加新的指定构造器。指定构造器必须总是由原始的类来实现提供

注意
如果你使用扩展为一个值类型添加构造器,同时该值类型的原始实现中未定义任何指定构造器且所有存储属性提供了默认值,那么我们可以再扩展中的构造里调用默认构造器和逐一成员构造器。

1
2
3
4
5
6
7
8
9
10
11
12
13
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()
}

let defaultRect = Rect()
let memberRect = Rect(origin: Point(x: 0.0, y: 2.0), size: Size(width: 5.0, height: 5.0 ))
1
2
3
4
5
6
7
8
extension Rect {
init(center: Point, size: Size) {
let originX = center.x - size.width / 2
let orginY = center.y - size.height / 2
self.init(origin: Point(x: orginX, y: originY), size: size)
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(x: 5.0, y: 5.0))
方法

扩展可以为已有类型添加实例方法和类型方法

可变实例方法

通过扩展添加的实例方法也可以修改该实例本身。结构体和枚举类型中修改self或其属性方法方法必须将改实例方法标注mutating

1
2
3
4
5
6
7
extension Int {
mutating func square (){
return self * self
}
}
var someInt = 3
somInt.square()
下标

扩展可以为已有类型添加新下标

1
2
3
4
5
6
7
8
9
10
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) %10
}
}
746[0]
嵌套类型

扩展可以为已有类型的类、结构体和枚举添加新的嵌套类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
extension Int {
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0 :
return .positve
default:
reutrn .negative
}
}
}

例子为Int添加了嵌套类型,这个名为Kind的枚举表示特定整数的类型。

0%