具有不同行为的协议扩展

如您所知,您可以在该协议的扩展名中为协议方法提供默认实现。 但是,当您决定在协议中声明该方法或将其忽略时,您是否知道其中的含义? 我们将研究差异。

让我们从默认情况下不会发出声音的动物的协议定义开始。

 协议动物{ 
func makeSound()
}
 扩展名动物{ 
func makeSound(){
打印(“ [silence ...]”)
}
}

然后,我们创建两个符合此协议Animal的对象CatDog 他们俩都可以发出自己的声音:

 猫:动物{ 
func makeSound(){
打印(“喵!”)
}
}
 狗类:动物{ 
func makeSound(){
打印(“糟糕!”)
}
}

如果我们想创建动物的集合并想让它们全部说出来,我们可以创建一个像这样的数组:

 让animal1 = Cat() 
让animal2 = Dog()
 让动物:[动物] = [动物1,动物2] 

然后,我们可以遍历动物,让它们发出声音:

 用于动物{ 
animal.makeSound()
}

那么输出是什么? 是的…它将是喵!Wo! 但是,如果我们没有在协议中声明方法但保留默认实现,将会发生什么?

 协议动物{} 
 扩展名动物{ 
func makeSound(){
打印(“ [silence ...]”)
}
}

这样,它们对两只动物都不会发出声音: [沉默……] [沉默……] 。 因此,有时这可能导致您的应用程序出现意外行为。 但是至少知道你知道它来自哪里