在學習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()
調用前類型轉換