将协议作为方法参数传递

时间:2011-09-20 22:10:02

标签: objective-c methods protocols arguments

首先让我解释一下我的意思。我不想在协议中输入参数:

-(void)someMethod:(id<SomeProtocol>)someArgument;

我想要的是将协议传递给方法的方式与将类传递给方法的方式相同(以下是不正确的,但希望能解释我想要做的事情):

-(void)someMethod:(Protocol)someArgument;

然后我希望能够使用协议检查一组对象是否实现它。

4 个答案:

答案 0 :(得分:15)

如果您在编码时知道协议的名称,请使用@protocol(SomeProtocol)获取指向该协议的指针,类似于您使用@selector(x)的方式。

除此之外,您只需引用具有类标识符Protocol的协议 - 因此您的方法声明将如下所示:

-(void)someMethod:(Protocol*)someArgument

您可以在NSObject conformsToProtocol:

的文档中看到一个示例

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/conformsToProtocol

答案 1 :(得分:3)

协议是一个类,所以你只需要像任何其他对象类型一样编写- (void)someMethod:(Protocol *)someArgument。您可以在conformsToProtocol:的声明中看到这一点:

+ (BOOL)conformsToProtocol:(Protocol *)aProtocol

答案 2 :(得分:1)

我不建议使用协议。它会模糊代码实际依赖的接口。使用id<yourprotocol>*。这实际上是cocoa框架如何通过协议。如果我不认为我正在尝试做HTML,请原谅单词的使用。

答案 3 :(得分:0)

- (void) executeRequest:(id<Protocol1>)request andCompletion:(id<Protocol2>)response

将协议传递给参数的唯一方法

因为 id <..> 表示它需要在传递参数之前遵守该协议