Swift:对于协议在这种情况下有用的原因很少感到困惑

时间:2017-10-06 15:58:09

标签: swift protocols

我在这里看到了这个例子

 protocol Barker {
    func bark()
}

class GermanShephard: Barker {
    func bark() {
        print("Bark")
    }
}

class BelgianMalinois: Barker {
    func bark() {
        print("Bark!")
    }
}

let dog = BelgianMalinois()
dog.bark()

我知道它是如何运作的。但是,我不知道这样做有什么好处。您可以删除协议,但仍然可以获得相同的结果。任何解释都会有用。我知道带有协议的委托对于将消息从一个对象发送到另一个对象很有用。这很有用,因为任何对象都可以继承委托。因此,像UITableView这样的库不必引用您的对象来向其发送消息。

3 个答案:

答案 0 :(得分:1)

您的简单示例中不需要该协议。但是,让我们展开你的榜样:

func handleBarkingDog(_ barker: Barker) {
    barker.bark()
}

let dog1 = BelgianMalinois()
let dog2 = GermanShephard()

handleBarkingDog(dog1)
handleBarkingDog(dog2)

var barker: Barker = dog1
barker = dog2

如果没有协议(或基类),您将无法将对两种不同类型的狗的引用传递给常用方法或将它们分配给变量。

答案 1 :(得分:0)

我也没有看到它。如果我想展示一个协议,我会用以下代码替换最后两个代码行:

func tease(_ barker: Barker) {
    barker.bark()
}

tease(GermanShephard())
tease(BelgianMalinois())

答案 2 :(得分:-1)

协议可用于定义一些常见功能。请考虑以下示例。

$query = "SELECT * FROM 
(SELECT items.part, items.id_items, id_intermediate, id_items 
FROM items JOIN intermediate 
WHERE inter.id_items IS NOT NULL) 
WHERE items.part LIKE '%$var%'";

在上面的例子中,bpth Dog and Human符合Walker协议,这意味着狗和人都有走路的功能。然而,实施可能会有所不同。