Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Cocoa 如果所有方法都是可选的,那么协议的目的是什么?_Cocoa_Cocoa Touch_Design Patterns_Swift Protocols_Objective C Protocol - Fatal编程技术网

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

Cocoa 如果所有方法都是可选的,那么协议的目的是什么?,cocoa,cocoa-touch,design-patterns,swift-protocols,objective-c-protocol,Cocoa,Cocoa Touch,Design Patterns,Swift Protocols,Objective C Protocol,我了解协议的用途(使类型符合方法或/和属性的集合列表),但我不了解所有可选方法的协议的用途。一个例子是UITextFieldDelegate 如果协议中的所有方法都是可选的,那么为什么要遵守协议而不是在类中从头开始编写方法呢?在这种情况下,我看不出遵守协议的好处或目的是什么 可选方法是否与可以实现的功能建议相同?默认情况下,协议中的所有方法都是必需的。如果nor要求所有功能正常运行,则每个方法都必须标记为可选 如果协议中的所有方法都是可选的,那么为什么要遵守协议而不是在类中从头开始编写函数呢 遵

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

如果协议中的所有方法都是可选的,那么为什么要遵守协议而不是在类中从头开始编写方法呢?在这种情况下,我看不出遵守协议的好处或目的是什么


可选方法是否与可以实现的功能建议相同?

默认情况下,协议中的所有方法都是必需的。如果nor要求所有功能正常运行,则每个方法都必须标记为可选

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

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


例如,
UIScrollViewDelegate
协议仅定义可选方法。假设我们有一个类
Foo
,我们想通过
UIScrollView
知道什么时候事情会发生变化

如果我们决定抛弃该协议,从头开始实现函数,我们将如何告诉
UIScrollView
我们实现了哪些方法,以及在特定事件发生时调用哪些方法?没有好办法让它知道。当构建
UIScrollView
时,它不知道
Foo
,所以它不知道它实现了什么方法。而且,
Foo
无法知道
UIScrollView
可以调用哪些方法


但是,当构建
UIScrollView
时,它确实知道
UIScrollViewDelegate
。因此,如果
Foo
符合
UIScrollViewDelegate
协议,那么现在就有了一个共同的定义,
Foo
UIScrollView
都可以遵循。因此
Foo
可以实现它关心的任何方法,比如
scrollViewDidScroll:
UIScrollView
只需检查代理是否实现了
UIScrollViewDelegate

中的方法历史上,对于Cocoa中的代理和数据源,使用了非正式协议。非正式协议通过
NSObject
类的类别实施:

@interface NSObject (NSTableViewDelegate)

- (int)numberOfRowsInTableView:(NSTableView *)tableView;

// ...

@end
随后,介绍了协议中的可选方法。这一变化导致更好地记录班级职责。如果您在代码中看到该类符合
NSTableViewDelegate
,您可能怀疑某个地方存在一个由该类实例管理的表视图

此外,此更改还导致在编译时进行更强的检查。若程序员意外地将错误的对象分配给
委托
数据源
属性,编译器将发出警告


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

协议为一个对象和另一个对象之间的接口建立契约。这些方法是可选的,这一事实简单地说明,您不必实现特定的方法,但如果您的应用程序需要,您可以实现

一般来说,如果您遵守的协议中所有方法都是可选的,那么您这样做是有原因的,即您计划实现其中一个或多个方法。仅仅因为协议的所有方法都是可选的,并不意味着您将不实现它们中的任何一个,而是简单地说,您可以选择与您的特定情况相关的方法

例如,考虑<代码> UITExtFieldAdvult协议。您通常会遵守这一点,因为您希望指定,例如,是否允许在文本字段中插入某些字符,或者在按下返回键时执行什么操作。有时,您只想实现前者。有时,您只想实现后者。有时你两者都做。但是,仅仅因为您选择实现一个或另一个并不意味着您一定要做另一个(但如果您愿意,您可以)。不过,坦率地说,如果您真的不想实现这些方法中的任何一种,您可能甚至不会费心指定文本字段的

委托
,也不会费心指定您是否符合协议


底线是,仅由可选方法组成的协议基本上说“如果您需要,这是您选择实现的方法的文档化接口”。该协议对于建立可能的接口仍然非常有用,但不会强制您实现不需要的方法

检查这个问题,它可能会帮助你所有伟大的答案。对另一个案例的评论非常有用。我认为所有任择议定书的理由主要用于代表。我勾选了与另一个问题类似的答案,但提供的所有答案都有意义。再次感谢大家!!!