Swift學習筆記-協議擴充套件
阿新 • • 發佈:2018-12-19
在Swift中進行面向物件程式設計時,儘量使用協議和泛型,而不是類繼承,因為過深的繼承層次很容易讓程式碼充滿難以理解的類。
協議擴充套件
前面我們介紹過了類的擴充套件,協議的擴充套件也是類似的,協議擴充套件可以新增現有的計算屬性和方法,不能新增儲存屬性。擴充套件不會增加協議的需求。 下面的程式碼中,所有實現Worker協議的結構體都獲得了一個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子句的協議擴充套件
和泛型一樣,協議也能使用where子句進行型別限制,下面的程式碼擴充套件了Sequence協議,使陣列元素為Worker時新增一個printAllWorker方法。
extension Sequence where Iterator.Element == Worker{
func printAllWorker(){
for worker in self {
print(worker.getDesc())
}
}
}
let workers:[Worker]=[Coder(),Teacher()]
workers.printAllWorker()
協議擴充套件的覆蓋
在Coder型別中可以使用同名方法覆蓋協議擴充套件中的方法,不過當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())