Farlanki

Swift的面向协议编程

字数统计: 341阅读时长: 1 min
2016/06/02 Share

WWDC 2015中,Dave Abrahams介绍了Swift的面向协议编程.

Protocol Extension

Swift 2增加了一个名为Protocol Extensions的新特性.即对协议进行扩展,为实现协议的种类(类,结构体,枚举类型)提供方法和属性的实现.

提供默认的实现

使用 protocol extension 可以为protocol提供默认的方法或者属性的实现.如果遵循protocol的种类对protocol有自己的实现,那么默认提供的实现就会被自己的实现代替.

举个栗子
先定义三个类circle,polygon和diagram

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
protocol drawable{
var serialNumber : Int {get set}
func draw()
}

class circle : drawable{
var center : CGPoint = CGPoint(x: 0,y: 0)
var radius : CGFloat = 0.0
var serialNumber : Int = 0

func draw(){
//draw a circle
}
}

class polygon : drawable{
var corners : [CGPoint] = []
var serialNumber : Int = 0
func draw(){
//draw a ploygon
}
}

class diagram{
var element : [drawable] = []
var serialNumber : Int = 0
func draw(){
//draw a diagram
}
}


}

这几个类都需要一个设置 serialNumber 的方法.可以发现,这几个类的设置serialNumber的方法是一样的,于是我们就可以创建一个Protocol Extension

1
2
3
4
5
extension drawable{
mutating func setSerialNumber(SerialNumber:Int){
self.serialNumber = SerialNumber
}
}

这样,服从drawable协议的类都默认实现了setSerialNumber()方法.
如果想只有diagram拥有这个默认方法,那么只需要使用where关键字:

1
2
3
4
5
extension drawable where Self : diagram{
mutating func setSerialNumber(SerialNumber:Int){
self.serialNumber = SerialNumber
}
}
CATALOG
  1. 1. Protocol Extension
    1. 1.1. 提供默认的实现