代码之家  ›  专栏  ›  技术社区  ›  Laurence Wingo

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

  •  0
  • Laurence Wingo  · 技术社区  · 6 年前

    我正在学习另一个UITableView教程,我的学习过程总是回到协议和委托的概念。有点令人困惑的是,这种协议类型的委托变量的概念。似乎在编程时,如果选择使对象符合协议,那么似乎还需要创建一个名为delegate的变量(属于协议类型)?我的一部分人说,我们不必创建这个变量,但我不确定,而且我也不完全理解这个变量的原因。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   matt    6 年前

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

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

    因此,这一切都与编译器有关。充当委托的对象可能符合协议,但编译器不知道这一点,除非将此变量类型化为协议采纳器。如果编译器不知道,它将不允许我们向委托对象发送委托消息!我们就是这样打的。这是编译器需要知道的最小值,以便允许我们发送委托消息。

        2
  •  1
  •   Rob Napier    6 年前

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

    Cocoa有一个传统,即使用一个名为 delegate 用于委托模式(在某些语言中也称为“策略模式”)。它是一个告诉您如何行为的对象(您将决策“委托”给它)。Cocoa有很长的一贯命名和使用名称的历史 代表 这很有帮助,因为它还暗示读者这是一个弱引用(同样,根据传统)。有时还有一个与委托完全相同的“数据源”,但它提供的是数据,而不是行为和配置。

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