在Swift中進行面向對象編程時,盡量使用協(xié)議和泛型,而不是類繼承,因為過深的繼承層次很容易讓代碼充滿難以理解的類。
協(xié)議擴展
前面我們介紹過了類的擴展,協(xié)議的擴展也是類似的,協(xié)議擴展可以添加現(xiàn)有的計算屬性和方法,不能添加存儲屬性。擴展不會增加協(xié)議的需求。
下面的代碼中,所有實現(xiàn)Worker協(xié)議的結構體都獲得了一個getDesc方法。
protocol Worker {
var job:String {get}
var workTime:Int{get}
}
struct Teacher:Worker {
let job="teacher"
let workTime=8
}
struct Coder:Worker {
let job="coder"
let workTime=10
}
extension Worker{
func getDesc()-> String{
return "I am a \(job),I work \(workTime) hours everday"
}
}
var coder=Coder()
print(coder.getDesc())
帶where子句的協(xié)議擴展
和泛型一樣,協(xié)議也能使用where子句進行類型限制,下面的代碼擴展了Sequence協(xié)議,使數(shù)組元素為Worker時新增一個printAllWorker方法。
extension Sequence where Iterator.Element == Worker{
func printAllWorker(){
for worker in self {
print(worker.getDesc())
}
}
}
let workers:[Worker]=[Coder(),Teacher()]
workers.printAllWorker()
協(xié)議擴展的覆蓋
在Coder類型中可以使用同名方法覆蓋協(xié)議擴展中的方法,不過當Coder當做一個Worker來使用的時候還是會調用Worker中的方法。
struct Coder:Worker {
let job="coder"
let workTime=10
func getDesc()-> String{
return "hello world"
}
}
let workers:[Worker]=[Coder(),Teacher()]
//I am a coder,I work 10 hours everday
//I am a teacher,I work 8 hours everday
workers.printAllWorker()
//hello world
let coder=Coder()
print(coder.getDesc())