为什么代表在iOS中存在?

Leg*_*tro 1 delegates ios

我理解委托本质上是另一个对象可以传递消息的对象,并且它们代表其他类使用.因此,例如,a UITableViewDelegate具有可用于检测a中的特定事件的方法UITableView.这非常有用,事实上我在过去的iOS项目中使用过很多代表,所以这更像是一种好奇心:

为什么委托类中的方法不仅存在于委托委托的类中?

当然,在实际的课程中使用这些方法会更方便,例如UITableView

也许它在架构上更方便,但从拳头看起来似乎反直觉.

Rob*_*ier 6

作为一般规则,组合比继承更强大.继承会产生许多微妙的问题,其中最常见的是钻石问题,但还有许多其他问题.

委托只是战略模式的一个特定表述,它允许我们通过组合而不是继承来扩展对象.

作为问题的具体示例,以及在使用继承时钻石问题如何蔓延,请考虑以下因素:

  • 您有一种非常常见的方式来提供细胞.例如,您需要Core Data提取请求或生成单元格的网络请求.因此,您将构建一个封装所有逻辑的超类.我们将调用处理它的类FetchRequestDataProviding.
  • 另外,你有一个你经常使用的视觉行为.例如,您需要为视图设置特定类型的动画,因此将其包装到类中FadeInTableView.

现在我们遇到了问题因为我们都需要.所以我们需要多重继承.而且多重继承是潘多拉的一堆含糊之处.

但是如果我创建FetchRequestDataProviding一个表现为委托的单独对象,我就会消除所有这些.我实际上可以通过突破FadeInAnimating作为代表/策略来使事情变得更加强大(尽管UIView今天没有这种力量).

在ObjC中,"组合比继承更强大"通常在一个相当浅的继承树和许多委托中表现出来.Swift使用没有继承的协议和结构进一步推动了这一点.这些都不意味着继承是坏的; 它可以有很多价值(虽然像Go这样的语言完全避免它;虽然有趣的是仍然必须面对因嵌入而导致的钻石问题).但是当有疑问时,构图是更强大的工具.