2012-07-12 52 views
1

有没有人知道这个语法通过MenuDelegate和<>括号?为什么有人想要这样一段代码复杂化。这个语法是什么意思? ID <asdfasdf>?

@protocol MenuDelegate 
    - (void)optionSelected:(NSString *)option; 
@end 

@interface ContentMenu : UITableViewController { 
    NSMutableArray *_test; 
    id<MenuDelegate> _delegate; 
} 

由于

回答

0

此语法意味着id变量采用称为MenuDelegate的协议。


语法对我来说也很奇怪,但不像调用方法那样奇怪。

+0

的答案,这是一类是如何采用协议:'@interface MyClass的:NSObject的 ...'(或任何其超是) 。 – 2012-07-12 04:28:27

+0

为什么不直接在@implementation中放置optionSelected函数? – mskw 2012-07-12 04:32:42

+0

因为它是一个委托协议。其他类也可以采用它,并且这种模式简化了多态性。 – 2012-07-12 05:49:11

0

这就是协议。 Objective-C中的协议是接口声明。它允许您指定您在委托中期望的某些方法集,而不强制传入的对象的类型。

id<MenuDelegate>表示实现MenuDelegate协议的任何类。它保证你可以调用MenuDelegate协议中指定的功能,而不会打扰对象的实际类型。

+0

这是为什么?我可以轻松地删除协议,只需在@implementation中放置optionSelected函数,就可以得到相同的结果。 – mskw 2012-07-12 04:31:57

+0

这是一种强制委托实现某些功能的方法 - 如果类没有在协议中实现该功能,编译器将生成警告。 – nhahtdh 2012-07-12 04:40:30

0

就像静态类型允许编译器测试基于类层次结构的类型一样,此语法允许编译器根据协议的一致性测试类型。有关更多信息,请参阅The Objective-C 2.0 Programming Language

0

看看苹果的文件说的协议

如果你知道一个对象的类,你可以看看它的接口 声明(它继承 从类和接口声明)找到它响应的消息。 这些声明 通告它可以接收的消息。协议为其提供了一种方式,使其 也可以通告其发送的消息

沟通是双向的;对象发送消息以及 接收它们。例如,一个对象可能会将某个操作的责任委托给另一个对象,或者它有时可能只需要向另一个对象请求信息。在某些情况下,对象 可能愿意通知其他对象其行为,以便他们可以采取可能需要的任何抵押措施。

如果您开发类发件人和类接收器 作为同一项目的一部分(或是否有其他人与 接收机及其接口文件中提供你),这种沟通是很容易 协调。发件人只需导入 接收器的接口文件。导入的文件声明发件人 在其发送的消息中使用的方法选择器。

因此,这是你的问题

Why not just put the optionSelected function inside @implementation? 
+0

查看整个文档,只需在下面的回答中参考@Prasad G提供的链接 – 2012-07-12 06:36:03