1. 程式人生 > >Swift學習筆記-協議擴充套件

Swift學習筆記-協議擴充套件

在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())