将协议作为方法参数传递

17

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

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

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

-(void)someMethod:(Protocol)someArgument;
我希望能使用该协议来检查一组对象是否实现了它。
4个回答

17

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

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

-(void)someMethod:(Protocol*)someArgument

你可以在这里的文档中查看一个示例,使用NSObject conformsToProtocol:函数。


1
谢谢。那么出于好奇,为什么协议使用指针而类不使用呢? - Undistraction
很抱歉,我自己也不知道答案。不过,这是个好问题。 - adpalumbo
1
协议和类都由它们自己的类表示。不同之处在于,单词“Class”被定义为指针,但“Protocol”只是类的名称,像任何其他类(例如NSString)一样;因此,对于一个协议实例,您必须有一个明确的指针。 - jscs
4
协议(protocol)是一个类(class),就像NSString或NSArray一样。Class不是一个类,它是一种类型,表示指向类的指针,就像id表示指向对象的指针一样。 - Chuck

3

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

+ (BOOL)conformsToProtocol:(Protocol *)aProtocol

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

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

因为id<..>表示在通过参数之前需要符合该协议。


完美,这是其他人没有提到的东西。 - vishal dharankar

1

我不建议使用协议。这会使你的代码实际依赖于哪个接口变得模糊。使用id<yourprotocol>*。这实际上是Cocoa框架传递协议的方式。如果我没有正确使用单词,请原谅,因为机器可能会将其解释为HTML。


此外,这是一种强类型语言,因此不要尝试使其表现为弱类型。 - Solomon
1
这个被踩是因为它不是 OP 想要的吗?这就是我想要的... @protocol(MyProtocol)varname 对我甚至都无法编译。 - Millie Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接