斯威夫特:为什么协议是有用的在这种情况下
问题描述:
小糊涂我碰到这个例子在这里斯威夫特:为什么协议是有用的在这种情况下
protocol Barker {
func bark()
}
class GermanShephard: Barker {
func bark() {
print("Bark")
}
}
class BelgianMalinois: Barker {
func bark() {
print("Bark!")
}
}
let dog = BelgianMalinois()
dog.bark()
我知道它是如何工作的。但是,我不知道这样做的好处。您可以删除协议并仍然得到相同的结果。任何解释都会有用。我知道使用协议的委托对于从一个对象向另一个对象发送消息很有用。这很有用,因为任何对象都可以继承委托。所以像UITableView这样的库不必引用你的对象来发送消息给它。
答
在您的简单示例中不需要该协议。但是,让我们扩大你的例子:
func handleBarkingDog(_ barker: Barker) {
barker.bark()
}
let dog1 = BelgianMalinois()
let dog2 = GermanShephard()
handleBarkingDog(dog1)
handleBarkingDog(dog2)
var barker: Barker = dog1
barker = dog2
未经协议(或基类),你将无法向两种不同类型的狗的引用传递给一个通用的方法或将其分配给一个变量。
答
我也没有看到它。如果我想展示一个协议的行动,我会用类似的东西替换最后两条代码行:
func tease(_ barker: Barker) {
barker.bark()
}
tease(GermanShephard())
tease(BelgianMalinois())
答
协议可以用来定义一些共同的功能。考虑下面的例子。
protocol Walker {
func walk()
}
class Dog: Walker {
func walk() {
print("Walk with four legs")
}
}
class Human: Walker {
func walk() {
print("Walk with two legs")
}
}
let spitz = Dog()
spitz.walk() // prints "Walks with four legs"
let person = Human()
human.walk() // prints "Walks with two legs"
在上面的例子中,bpth Dog和Human符合协议Walker,这意味着狗和人都有走路的特征。但是,实施可能会有所不同。
+1
你的回答并不能说明为什么协议有用。在你的答案中,协议没有任何理由。 – rmaddy
谢谢,这是有道理的。由于该方法具有参数类型Barker,因此可以采用符合协议的任何对象。或者,如果您创建了类型剥皮器,则可以为它分配一个符合协议的对象。更有意义,看起来更有用。 –