如果所有方法都是可选的,协议的目的是什么?

时间:2016-02-29 23:19:30

标签: cocoa cocoa-touch design-patterns swift-protocols objective-c-protocol

我理解协议的用途(使类型符合方法或/和属性的集合列表),但我不了解所有可选方法的协议的用途。一个例子是UITextFieldDelegate

如果协议中的所有方法都是可选的,为什么你要遵守协议而不是在你的课程中从头开始编写方法?在这种情况下,我不知道符合协议的好处或目的是什么。

可选方法是否只是可以实现的功能建议?

3 个答案:

答案 0 :(得分:1)

默认情况下,协议中的所有方法都是必需的。如果所有内容都必须正确运行,则每种方法都必须标记为可选。

  

如果协议中的所有方法都是可选的,为什么你要遵守协议而不是在你的班级中从头开始编写函数?

符合协议允许您的类告诉另一个对象它拥有的方法,而其他对象不需要知道您的类。这在使用Delegation时非常有用,因为它允许代表决定他们希望接收/提供给另一个类的信息。

例如,UIScrollViewDelegate协议仅定义可选方法。让我们说我们有一个Foo课,我们想知道什么时候用UIScrollView改变了。

如果我们决定抛弃该协议并从头开始实现这些函数,我们如何告诉UIScrollView我们实现哪些方法以及在发生特定事件时调用哪些方法?没有什么好办法可以找到答案。构建UIScrollView时,它不知道Foo,因此无法知道它实现了哪些方法。此外,Foo无法知道UIScrollView可以在其上调用哪些方法。

但是,在构建UIScrollView时,它确实知道UIScrollViewDelegate。因此,如果Foo符合UIScrollViewDelegate协议,则现在有FooUIScrollView可以遵循的通用定义。因此,Foo可以实现其关注的任何方法,例如scrollViewDidScroll:UIScrollView只需要检查代理是否在UIScrollViewDelegate中实现了方法。

答案 1 :(得分:1)

历史上,对于Cocoa中的代理和数据源,使用了非正式协议。非正式协议是通过1.53589 0 类的类别实现的:

NSObject

后来,引入了协议中的可选方法。这种变化可以更好地记录课堂责任。如果您在代码中看到该类符合@interface NSObject (NSTableViewDelegate) - (int)numberOfRowsInTableView:(NSTableView *)tableView; // ... @end ,则您怀疑某个地方存在一个表视图,该视图由该类的实例管理。

此外,此更改会导致编译时间更强的检查。如果程序员意外地将错误的对象分配给NSTableViewDelegatedelegate属性,编译器将发出警告。

但你的假设也是正确的。可选方法也是可能功能的建议。

答案 2 :(得分:1)

协议为一个对象与另一个对象之间的接口建立合同。这些方法是可选的这一事实只是表示您不必实施该特定方法,但如果您的应用程序需要它,则可以。

通常,如果您符合所有方法都是可选的协议,那么您出于某种原因这样做,即您计划实施其中一个或多个方法。仅仅因为所有协议的方法都是可选的并不意味着你不会实现它们中的任何一个,而只是简单地说你可以选择在你的特定情况下相关的方法。

例如,考虑UITextFieldDelegate协议。您通常会遵循这一点,因为您要指定,例如,是否应允许某些字符插入文本字段或按下返回键时要执行的操作。有时你只想实现前者。有时你只想实现后者。有时你会两个都做。但仅仅因为你选择实施一个或另一个并不意味着你一定想要做另一个(但你可以,如果你想)。坦率地说,如果你真的不想实现任何方法,你可能不会费心去指定文本字段的delegate,也不用费心去指定你&#39 ;符合协议。

最重要的是,仅由可选方法组成的协议基本上表示"如果需要,这是您可能选择实施的方法的文档化界面"。该协议对于建立可能的接口仍然非常有用,但并不强制您实现那些您不需要的方法。