protocol組合

在學習swift時 發現Any定義如下?

public typealias Any =protocol<>

發現了這個東東 protocol<> 學習一通后特來總結下:

protocol<>是什么意思呢? 簡單的說是”實現空接口“,其實就是任意接口,

protocol<>的標準形式其實這樣的

protocol<Protocol1,Protocol2,Protocol3>

尖括號內就是具體事實現的接口,整體表達的就是匿名接口。

上面的寫法等價于:

protocol ProtocolD4:Protocol1,Protocol2,Protocol3 {

}

具體用法下面我舉個比較簡單的例子:

protocol KittenLike {

func meow() -> String

}

protocol DogLike {

func bark() -> String

}

typealias PetLike = protocol<KittenLike,DogLike>

struct SoundChecker {

? ? ? static func checkPetTalking(pet:PetLike) {

? ? ? }?

}

或者:

struct SoundChecker {

? ?static func checkPetTalking(pet:protocol<KittenLike,DogLike>) {

? ?}

}

是不是表達上很清晰. 使用者一眼就可以知道 pet的定義及需要實現哪些protocol,

這樣一來 我們就不需要自己定義個protocol。只需要定義一個匿名的protocol 讓別人實現就好。

下面說一個比較特殊的例子:

protocol A {

func play() -> String

}

protocol B {

func play() -> Int

}

struct C : A ,B {

? ?func play() -> String {

? ? }

? ?func play() -> String {

? ?}

}

let c = C()

A B有個相同名稱的方法play 只是返回值不同,這時候C同時實現了A,B

那么就會出現調用沖突,

c.play() ?調用的是A還是B的方法

為了避免沖突,我們可以使用下面的方法避免這種沖突

(c instance A).play()

(c instance B),play()

調用前類型轉換

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容