這一節主要介紹了協議的兩種類型普通的協議
和帶有關聯類型的協議
, 咱們再前面講的都是普通的協議,本小節還引入了一個新的概念類型抹消
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
這樣去使用,編譯器會報錯
。