[swift 進階]讀書筆記-第十章:協議 C10P2 協議的兩種類型 Two Types of Protocols

第十章:協議 Protocol Protocol-Oriented Programming

10.2 協議的兩種類型 TwoTypesofProtocols

這一節主要介紹了協議的兩種類型普通的協議帶有關聯類型的協議, 咱們再前面講的都是普通的協議,本小節還引入了一個新的概念類型抹消git

什麼是帶有關聯類型的協議:

class 的範型類型參數寫法github

class Person<T> { ... }
複製代碼

protocol 和 class、struct 以及 enum 不一樣,它不支持範型類型參數。取而代之的是支持抽象類型成員;稱做關聯類型swift

這樣單純的講的確有些抽象,其實你在playGround中把下面的demo寫一遍就知道很簡單的😄函數

關聯類型就是能夠使你在協議方法中的參數類型保存一致。spa

帶有關聯類型的協議的使用場景

有時候會遇到這樣的需求,繼承自某一協議的類中須要保證代理方法處理的參數類型保持一致 咱們能夠聯想UITableView的代理來記憶關聯類型的使用場景翻譯

協議聲明:代理

protocol ATypeDelegate {
    /// 關聯類型的協議須要你去手動寫associatedtype  建立系統提供的關聯類型 T  
    associatedtype T
    /// 自定義函數的參數是
    func printContent( ct : T)

    func colum( ct : T)

}
複製代碼

協議使用:code

class ATypeClass: ATypeDelegate {
    ///只要遵照了ATypeDelegate協議 系統會自動補全 typealias T = "你指定的類型"
    typealias T = Int

    func printContent(ct: Int) {
        print("Int",#function)

    }

    

    func colum(ct: Int) {

        print("Int",#function)

    }
}
複製代碼

ATypeClass 繼承自ATypeDelegate,必須在ATypeClass類中定義 T 的具體類型才能使用繼承

let a = ATypeClass()
a.printContent(ct: 888)
a.colum(ct: 999)
//Int printContent(ct:)
//Int colum(ct:)
複製代碼

類型抹消:

定義和使用場景

所謂類型抹消就是不將某實例的真實類型暴露出去,對外只暴露一個必要的類型ci

舉例 當咱們編寫一個class或者struct並實現了一個協議,當咱們對外提供該實例時,只想讓外界知道這個東西實現了該協議,但是又不想讓外界知道實現了這個協議的class或者struct是哪個類型的,這時咱們就須要用到類型抹消

使用方法: 這裏推薦swiftgg翻譯組的Swift 類型擦除 一文,這裏對類型抹消的理解和使用有一個很全面的介紹。

小知識點:

在上一節中咱們能夠寫出

var context: Drawing = SVG()
複製代碼

這裏將 Drawing協議 做爲一個類型來使用。

當你的協議存在關聯類型的協議就不可以像Drawing這樣去使用,編譯器會報錯

文章源文件地址,你們若是有更好的想法和觀點歡迎交流

相關文章
相關標籤/搜索