在Swift中,符合协议的对象是否绝对需要委托变量才能使用协议?

时间:2018-04-04 00:11:08

标签: swift delegates protocols

我正在通过另一个UITableView教程,我的学习过程总是会回归到协议和委托的想法。有点混乱的区域是该类型协议的委托变量的想法。似乎在编程时,如果您选择使对象符合协议,那么您似乎还需要创建一个名为delegate的变量(类型协议)?我的一部分人说我们必须创建这个变量并不是真的,但我不确定加上我还没有完全理解这个变量的原因。

我理解为了使对象符合协议,它需要实现某些变量和/或方法。当我看到一个教程在同一个对象中创建一个名为delegate的变量时,我总是感到困惑。如果对象已经通过实现变量和/或方法符合协议,那么创建名为delegate的变量并将类型设置为协议的变量的原因是什么?

2 个答案:

答案 0 :(得分:1)

不,协议是与代表分开的概念。 Cocoa中的委托模式通常使用协议,尽管它不需要。在ObjC 2之前,几乎所有代表团都使用“非正式”协议(即没有定义实际协议)。在Core Foundation和Swift中,委托可以使用结构而不是协议来实现(这在Core Foundation中有点常见,但在今天的Swift中更为罕见)。

Cocoa中有一种传统,即使用名为delegate的属性,您可以将其用于委派模式(在某些语言中也称为“策略模式”)。它是一个告诉你如何表现的对象(你“委托”它的决定)。 Cocoa有着悠久的历史记录,并且使用名称delegate非常有用,因为它也向读者暗示它是一个弱引用(再次,传统)。有时候还有一个“数据源”与委托完全相同,但提供数据而不是行为和配置。

但协议比这要大得多。协议只是实现方法的承诺。除了授权之外,它还可用于许多其他事情。

答案 1 :(得分:1)

  

如果对象已经通过实现变量和/或方法符合协议,那么创建名为delegate的变量并将类型设置为协议的变量的原因是什么?

协议委托模式中协议的全部目的是,这个类将要向委托发送委托消息的唯一需要知道或关心的是,委托是采用者该协议 - 即它实现变量/方法。该类不需要知道委托的实际;它只需要知道代理可以发送委托消息。

因此,它完全是关于编译器的。充当委托的对象可以符合协议,但编译器不知道除非将此变量键入为协议采用者。如果编译器不知道,它将不允许我们将委托消息发送到委托对象!这就是我们打字的方式。这是编译器需要知道的最小值,以便允许我们发送委托消息。