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协议。您通常会遵守这一点,因为您希望指定,例如,是否允许在文本字段中插入某些字符,或者在按下返回键时执行什么操作。有时,您只想实现前者。有时,您只想实现后者。有时你两者都做。但是,仅仅因为您选择实现一个或另一个并不意味着您一定要做另一个(但如果您愿意,您可以)。不过,坦率地说,如果您真的不想实现这些方法中的任何一种,您可能甚至不会费心指定文本字段的
委托
,也不会费心指定您是否符合协议
底线是,仅由可选方法组成的协议基本上说“如果您需要,这是您选择实现的方法的文档化接口”。该协议对于建立可能的接口仍然非常有用,但不会强制您实现不需要的方法 检查这个问题,它可能会帮助你所有伟大的答案。对另一个案例的评论非常有用。我认为所有任择议定书的理由主要用于代表。我勾选了与另一个问题类似的答案,但提供的所有答案都有意义。再次感谢大家!!!