2016-08-18 38 views
0

许多CocoaPod和本机iOS库都使用协议,它们的名称可以是CustomClassDelegateCustomClassDataSource作为执行某些设置或自定义的手段。我想知道什么时候应该使用这个编程模型,因为看起来我可以通过属性完成大部分工作。iOS:何时使用委托/数据源(协议)与属性

如果我定义一个名为SmurfViewController的自定义类具有SmurfLabel,是更好的做法是在smurfLabel存储为私有财产,有一个公共计算财产称为smurf看起来像这样:

private var smurfLabel = UILabel() 
public var smurf: String { 
    get { 
    return smurfLabel.text 
    } 
    set(text) { 
    smurfLabel.text = text 
    } 
} 

,或者我应该定义一个SmurfDataSource具有公共职能,看起来像这样:

func textForSmurfLabel() -> String { 
    return "smurfText" 
} 

什么时候该用什么?

+0

您无法使用相同的属性。据我所知,协议是用户用来在某个动作完成时通知其他类的自定义委托方法。 –

+0

您可以使用回调代替代表。事实上,它是受到鼓励的。不错的教程:https://medium.cobeisfresh.com/why-you-shouldn-t-use-delegates-in-swift-7ef808a7f16b#.erlmejwjo – Siriss

+0

隐含在评论/答案在这里,委托协议模式是一种方式一个班级通知另一个事件。通常,在考虑委托时,您将委托协议模式与其他通知模式(例如回调闭包,通知,观察员等)进行比较。属性本身完全不同,旨在允许外部对象查询一些对象,但不是主动通知某些状态变化。 – Rob

回答

1

你应该只使用一个属性。代理和数据源是用于不同的控制器/对象在替代方案是从navigationStack/view层次结构实例化控制器/对象时彼此对话。代表形成了两者之间的具体沟通,可以让他们清楚知道他们之间的关系,同时保持他们之间的联系(假设您试图保持这种关系)。我不同意那篇表示回调“更好”的文章。他们非常棒,我建议他们经常使用它们,但是要明白,swift提供给你的大多数选项都有一个最适合他们工作的地方。

我可能会略有偏差,但是斯威夫特是一个惊人的语言,面向对象为骨干,一切都已经被放在一起,以提供正确的工具,你会发现自己在每种情况下。

我常发现自己在我的更高级的设置中使用了这些工具和另外一个可自定义的选项,其中我有一个监督viewController来管理许多子控制器。它可以直接访问所有活动中的所有人,但如果其任何孩子与其通信,则通过代表进行。它的主要工作就是处理它们在屏幕上的位置,所以我保持一切可以管理。

0

代表和数据源更适合将行为卸载到其他实体,而不是简单的值。换句话说,如果你的类型只是需要某个值的值,那么将它作为一个可以从客户端代码设置的属性显得更有意义是正确的。

但是当用户点击一个特定的表格视图单元格时应该发生的事情是一种不应该被硬编码到UITableView中的行为。相反,为了灵活性,可以在委托中创建该行为的任何实现,并在适当时由UITableView调用。

一般来说,将委托视为不必要的子类化的一种方式,因为通常在子类中重写的方法将移入可由ANY类型实现的协议中,而不仅仅是基类型的子类。而不是调用内部实现的方法来获得某些行为,而只是在外部协作类(委托)上调用这些行为。

因此,对于何时使用数据源或委托最好的指导方针是“我需要为了改变这个值或未来的行为而继承这个类”。如果答案是否定的,因为您可以从客户端代码中设置属性,则不要使用委派。如果答案是肯定的,那么将该行为转移到委托或数据源,而不是强迫未来的程序员继承你的类的子类以使其适用于他们的用例。

+0

我想补充一点,那些经常查询的简单数值*可能会频繁变化*最好通过协议查询。例如,这就是'UITableView'用于区段和行数的功能。这个更好的原因是提供者可以在一个地方放置代码来计算值,如果需要这样的代码的话。如果这些属性是属性,那么提供者可能必须从代码中的许多位置设置它们。那会很麻烦。 – Avi

0

委托是未定义活动的接口。 因此,当您制作SDK或框架时,您必须提供一个接口,以便用户可以为接口的预期活动编写适当的代码。

即,表视图需要一个数据源,以显示它的内容,但苹果的图书馆开发商不知道什么内容他们的图书馆用户使用的内容。所以他们提供了一个像数据源,委托这样的接口。 和在图书馆,他们只是调用这个方法。这就是图书馆应该制作的方式。

但在你的代码,标签的定义非常明确,以及它在目前看来,你不需要做一个接口未定义的活动。

,如果你想知道更多关于这种编码风格的,你需要做的设计模式的一些研究。

https://en.wikipedia.org/wiki/Observer_pattern

https://en.wikipedia.org/wiki/Delegation_pattern

https://en.wikipedia.org/wiki/Software_design_pattern

我喜欢苹果的SDK非常多,因为他们使用的所有必要的设计模式非常正常。