場景:聲明一個數(shù)組中包含多種類型的實例琅锻,并且這些類型都遵循相同的(一個或多個)協(xié)議齐婴。
Ans:這種情況聲明數(shù)組的類型可以用協(xié)議名稱诸老,多個協(xié)議之間用&符號連接团南。意思是只要遵守這些協(xié)議的實例都可以放在這個數(shù)組中群凶。
1. 首先插爹,定義兩個協(xié)議:
protocol ProtocolA {
func doSomethingA()
}
protocol ProtocolB {
func doSomethingB()
}
2. 然后,創(chuàng)建符合這兩個協(xié)議的不同類型:
class ClassA: ProtocolA, ProtocolB {
func doSomethingA() {
print("Class A doing something A")
}
func doSomethingB() {
print("Class A doing something B")
}
}
class ClassB: ProtocolA, ProtocolB {
func doSomethingA() {
print("Class B doing something A")
}
func doSomethingB() {
print("Class B doing something B")
}
}
struct StructC: ProtocolA, ProtocolB {
func doSomethingA() {
print("Struct C doing something A")
}
func doSomethingB() {
print("Struct C doing something B")
}
}
3. 最后请梢,聲明并初始化一個數(shù)組赠尾,其元素類型遵守 ProtocolA 和 ProtocolB:
let mixedArray: [ProtocolA & ProtocolB] = [ClassA(), ClassB(), StructC()]
4. 遍歷數(shù)組并執(zhí)行兩個協(xié)議中的方法
for item in mixedArray {
item.doSomethingA()
item.doSomethingB()
}
注意:這里如果使用AnyObject替代具體的協(xié)議名稱雖然也不會報錯,但是在寫代碼的時候盡量要明確數(shù)組中的實例類型或?qū)嵗袷氐膮f(xié)議