背景介绍
苹果在2015年和2016年连续两年的WWDC上都提倡面向协议编程
Object-C是纯面向对象的语言;Swift是面向对象(兼容Object-C)、面向协议、函数式、值类型等多种范式都兼容的语言。
Swift推荐用值类型,用struct,用面向协议的方式
协议相当于C++的虚基类,可以多继承,类,结构体、枚举都可以用,比基类好。
系统的照样用类,一级继承系统API,加final关键字,防止多级继承
鼓励多用struct + 协议的方式,值类型,线程安全
将协议、扩展、泛型三块结合起来用
关键点
Self Requiremen,在protocol引用自己,用大写的Self
在具体的实现类中,不用as
在用protocol作为类型的场合,用泛型。
protocol Ordered {
func precedes(other: Self) -> Bool
}
class Number : Ordered {
var value: Double = 0
func precedes(other: Number) -> Bool {
return value < other.value // 这里other就不需要as到Number
}
}
func binarySearch<T: Ordered>(sortedKeys: [T], forKey k: T) -> Int {
var lo = 0
var hi = sortedKeys.count
while hi > lo {
let mid = lo + (hi - lo) / 2
if sortedKeys[mid].precedes(k) {
lo = mid + 1
} else {
hi = mid
}
}
return lo
}
使用协议扩展,提供协议的默认实现。这个作用有点类似Object-C中的protocol可选函数。
一般使用,只要不涉及到protocol引用自身,就不需要引入泛型。用protocol作为接口和虚基类,能很好地解耦。扩展协议提供默认实现这个特性,推荐使用。在定义协议的时候紧接着就提供相应的默认值,特别是属性。