Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中,符合协议的对象是否绝对需要委托变量才能使用协议?_Swift_Delegates_Protocols - Fatal编程技术网

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

在Swift中,符合协议的对象是否绝对需要委托变量才能使用协议?,swift,delegates,protocols,Swift,Delegates,Protocols,我正在学习另一个UITableView教程,我的学习过程总是回到协议和委托的概念。有点让人困惑的是,这种协议类型的委托变量的概念。似乎在编程时,如果您选择使对象符合协议,那么您似乎还需要创建一个名为delegate的变量(属于协议类型)?我的一部分说我们不需要创建这个变量,但我不确定,而且我也不完全理解这个变量的原因 我理解,为了使对象符合协议,它需要实现某些变量和/或方法。当我看到一个教程在同一个对象中创建一个名为delegate的变量时,我总是感到困惑。如果对象通过实现变量和/或方法已经符合

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


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

否,协议是与委托不同的概念。Cocoa中的委托模式通常使用协议,尽管它不必这样做。在ObjC 2之前,几乎所有的授权都是通过“非正式”协议完成的(即没有定义实际的协议)。在核心基础和SWIFT中,委托可以用结构而不是协议来实现(这在核心基础上有点常见,但在SWIFT今天更为少见)。 Cocoa有一个传统,就是使用一个名为
delegate
的属性,用于委托模式(在某些语言中也称为“策略模式”)。它是一个告诉您如何行为的对象(您将决策“委托”给它)。Cocoa对事物的命名有着悠久的历史,使用名称
delegate
非常有帮助,因为它还向读者暗示它是一个弱引用(同样,根据传统)。有时还有一个“数据源”,它与委托完全相同,但提供的是数据,而不是行为和配置


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

不,协议与委托是一个独立的概念。Cocoa中的委托模式通常使用协议,尽管它不必这样做。在ObjC 2之前,几乎所有的授权都是通过“非正式”协议完成的(即没有定义实际的协议)。在核心基础和SWIFT中,委托可以用结构而不是协议来实现(这在核心基础上有点常见,但在SWIFT今天更为少见)。 Cocoa有一个传统,就是使用一个名为
delegate
的属性,用于委托模式(在某些语言中也称为“策略模式”)。它是一个告诉您如何行为的对象(您将决策“委托”给它)。Cocoa对事物的命名有着悠久的历史,使用名称
delegate
非常有帮助,因为它还向读者暗示它是一个弱引用(同样,根据传统)。有时还有一个“数据源”,它与委托完全相同,但提供的是数据,而不是行为和配置

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

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

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

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

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

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

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

UITableView
(和一些其他控件)遵循“委托模式”的概念-这允许将控件功能的责任“委托”给一些其他“实现”。这意味着您不必在每次使用它并提供sa时都从
UITableView
进行扩展