Swift學習筆記-協(xié)議擴展

在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())
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,655評論 0 4
  • 本章將會介紹 泛型所解決的問題泛型函數(shù)類型參數(shù)命名類型參數(shù)泛型類型擴展一個泛型類型類型約束關聯(lián)類型泛型 Where...
    寒橋閱讀 713評論 0 2
  • 在《松埡庫里:關于庫里母親4件事》這篇文章中,我們就提到,斯蒂芬?guī)炖镞€有一個弟弟,叫賽斯庫里,比斯蒂芬小兩歲,現(xiàn)在...
    chench007閱讀 1,755評論 0 0
  • 年齡是越長越大,眼界卻越來越小了,生活圈子一成不變,困住的不只是肉體,還有靈魂。 人到中年,衣食無憂,一切看起...
    原來的蘿卜閱讀 269評論 0 0
  • 有很多話要說,然后不知道怎么表達,慢慢的我也就忘記怎么說了。有很多人要謝,拖著拖著就忘記了。也對不起很多人,一...
    安夏天閱讀 461評論 0 0

友情鏈接更多精彩內容