首先让我解释一下我的意思。我不想在协议中输入参数:
-(void)someMethod:(id<SomeProtocol>)someArgument;
我想要的是将协议传递给方法的方式与将类传递给方法的方式相同(以下是不正确的,但希望能解释我想要做的事情):
-(void)someMethod:(Protocol)someArgument;
然后我希望能够使用协议检查一组对象是否实现它。
答案 0 :(得分:15)
如果您在编码时知道协议的名称,请使用@protocol(SomeProtocol)
获取指向该协议的指针,类似于您使用@selector(x)
的方式。
除此之外,您只需引用具有类标识符Protocol
的协议 - 因此您的方法声明将如下所示:
-(void)someMethod:(Protocol*)someArgument
您可以在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 <..> 表示它需要在传递参数之前遵守该协议