斯威夫特的代表,我们需要它们吗?

时间:2015-12-25 00:19:14

标签: swift interface delegates

我来自C#背景,说Swift中的委托(不是C#版本)与C#中的接口基本相同是否正确?

我在Swift中看到了使用委托的教程,用于将数据从一个视图控制器传递到另一个视图控制器。

我的问题是,不能简单地将一个函数添加到swift类中,然后将视图控制器子类分类吗?喜欢

func Sh​​owName(name:String)

让第一个视图控制器使用它调用第二个控制器 function(在第二个控制器的子类中的类)。

2 个答案:

答案 0 :(得分:1)

从技术上讲,Swift protocols类似于C#接口。协议实际上是一个类将实现的方法/属性的契约。与C#接口一样,它可以用于委托模式,但它也有更广泛的应用。

但协议在委派模式中起着核心作用(参见 The Swift Language 中的Delegation讨论或 Cocoa中的ProtocolDelegation讨论核心能力),其中一个对象可以指定与之通信的另一个对象。该协议简单地概述了对象对其委托对象的要求的精确性,以及它为其委托支持的可选接口。

在回答您的问题时,当您拥有delegate时,您在技术上不需要使用协议,但最佳做法是这样做。它使得两个类之间的正式契约非常明确,同时保持两个类的松散耦合。

虽然实施协议可能需要额外的两到三分钟,但几乎总是值得付出努力。它将在未来简化您对这些类的维护。因此,虽然您在技术上不需要为代理使用协议和/或在对象之间交换信息,但我认为如果您这样做,您会感谢自己。

答案 1 :(得分:0)

您需要代表

无论你是否创造了自己的一些,你都无法使用它们 - 它们无处不在。

是的,您可以简单地在viewController中定义一个函数并调用该函数,但是该方法的调用者现在必须处理一个viewController,他真正关心的是什么。他所关心的只是有/必须是一个名为showName的函数。

如果您要向前传递数据,则不必使用委派,因为您知道要将数据传递到的位置。但是如果你想传回数据,你通常不知道你来自哪里 - > second controller不知道,应该不知道他是first view controller提出的。无论从哪里出来,他都应该以同样的方式工作。任何对他负责的人都可以而且应该将自己指定为代理人,了解变更或回调或其他任何事情。

你提到的子类基本上是这样的,但是你只能子类化一次,因此如果你想让你的类成为TableView,CollectionView和你的CustomView的委托,那么你将只有子类化的糟糕时间。您将要使用的是通过protocols

进行委派