Swift系列15-扩展

扩展

扩展为现有的类,结构体,枚举和协议添加新功能.
扩展可以向一个类型添加新的方法,但是不能重写已有的方法.

扩展跟OC的分类有点相似,但是Swift的扩展是没有名字的.

extension 关键字
形如:

1
2
3
extension SomeType{

}

扩展计算属性

扩展可以添加计算属性,但是不能添加存储属性,也不能为已有的属性添加属性观察者.

1
2
3
4
5
6
7
8
class Tuesday: NSObject {

}
extension Tuesday{
var weekName:String{
return "周二"
}
}

扩展新的初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//原有的初始化
class Tuesday: NSObject {
override init() {
super.init()
}
}
extension Tuesday{
//初始化
convenience init(_ new:String) {
self.init()
}
}
//调用
class Owner: NSObject {
override init() {
let t1 = Tuesday.init("12321")
}
}

扩展新的实例方法和类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Tuesday: NSObject {
override init() {
super.init()
}
}
extension Tuesday{
//类方法
class func fun1(){
print("func1")
}
//实例方法
func fun2(){
print("fun2")
}
}

class Owner: NSObject {
override init() {
let t1 = Tuesday.init("周二")
//调用
t1.fun2()
Tuesday.fun1()
}
}

异变方法

增加了扩展的实例方法仍可以修改(或异变)实例本身.结构体和枚举类型方法在修改 self 或本身的属性时必须标记实例方法为 mutating,和原本实现的异变方法一样.
下面的例子为 Swift 的 Int 类型添加了一个新的异变方法 square ,以表示原值的平方:

1
2
3
4
5
6
7
8
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
//someInt is now 9

扩展协议

协议扩展能添加已经实现的属性和方法,但是不能为协议添加新的必须要实现的属性和方法.

1
2
3
extension UITextFieldDelegate{

}

扩展类遵循协议

扩展类遵循多个协议.

1
2
3
4
5
6
class People: NSObject {

}
extension People:UITextViewDelegate,UITextFieldDelegate{

}

其他扩展

定义下标
定义和使用新的内嵌类型

THE END