场景:声明一个数组中包含多种类型的实例,并且这些类型都遵循相同的(一个或多个)协议。
Ans:这种情况声明数组的类型可以用协议名称,多个协议之间用&符号连接。意思是只要遵守这些协议的实例都可以放在这个数组中。
1. 首先,定义两个协议:
protocol ProtocolA {
func doSomethingA()
}
protocol ProtocolB {
func doSomethingB()
}
2. 然后,创建符合这两个协议的不同类型:
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. 最后,声明并初始化一个数组,其元素类型遵守 ProtocolA 和 ProtocolB:
let mixedArray: [ProtocolA & ProtocolB] = [ClassA(), ClassB(), StructC()]
4. 遍历数组并执行两个协议中的方法
for item in mixedArray {
item.doSomethingA()
item.doSomethingB()
}
注意:这里如果使用AnyObject替代具体的协议名称虽然也不会报错,但是在写代码的时候尽量要明确数组中的实例类型或实例遵守的协议