具有不同行为的协议扩展
如您所知,您可以在该协议的扩展名中为协议方法提供默认实现。 但是,当您决定在协议中声明该方法或将其忽略时,您是否知道其中的含义? 我们将研究差异。
让我们从默认情况下不会发出声音的动物的协议定义开始。
协议动物{
func makeSound()
}
扩展名动物{
func makeSound(){
打印(“ [silence ...]”)
}
}
然后,我们创建两个符合此协议Animal的对象Cat和Dog 。 他们俩都可以发出自己的声音:
猫:动物{
func makeSound(){
打印(“喵!”)
}
}
狗类:动物{
func makeSound(){
打印(“糟糕!”)
}
}
如果我们想创建动物的集合并想让它们全部说出来,我们可以创建一个像这样的数组:
让animal1 = Cat()
让animal2 = Dog()
让动物:[动物] = [动物1,动物2]
然后,我们可以遍历动物,让它们发出声音:
用于动物{
animal.makeSound()
}
那么输出是什么? 是的…它将是喵! 和Wo! 但是,如果我们没有在协议中声明方法但保留默认实现,将会发生什么?
协议动物{}
扩展名动物{
func makeSound(){
打印(“ [silence ...]”)
}
}
这样,它们对两只动物都不会发出声音: [沉默……] [沉默……] 。 因此,有时这可能导致您的应用程序出现意外行为。 但是至少知道你知道它来自哪里