首先让我解释一下我的意思。我不想为协议键入参数:
-(void)someMethod:(id<SomeProtocol>)someArgument;
我想要的是以与传递类相同的方式将协议传递给方法(下面的示例不正确,但希望能解释我想做什么):
-(void)someMethod:(Protocol)someArgument;
我希望能使用该协议来检查一组对象是否实现了它。首先让我解释一下我的意思。我不想为协议键入参数:
-(void)someMethod:(id<SomeProtocol>)someArgument;
我想要的是以与传递类相同的方式将协议传递给方法(下面的示例不正确,但希望能解释我想做什么):
-(void)someMethod:(Protocol)someArgument;
我希望能使用该协议来检查一组对象是否实现了它。如果你在编写代码时知道协议的名称,请使用@protocol(SomeProtocol)
来获取指向该协议的指针,类似于使用@selector(x)
的方式。
除此之外,你只需使用类标识符Protocol
来引用协议--你的方法声明将如下所示:
-(void)someMethod:(Protocol*)someArgument
你可以在这里的文档中查看一个示例,使用NSObject conformsToProtocol:
函数。
Protocol是一个类,所以你只需要像使用其他对象类型一样编写- (void)someMethod:(Protocol *)someArgument
。在conformsToProtocol:
的声明中可以看到这一点:
+ (BOOL)conformsToProtocol:(Protocol *)aProtocol
- (void) executeRequest:(id<Protocol1>)request andCompletion:(id<Protocol2>)response
将协议传递到参数的唯一方法
因为id<..>表示在通过参数之前需要符合该协议。
我不建议使用协议。这会使你的代码实际依赖于哪个接口变得模糊。使用id<yourprotocol>*
。这实际上是Cocoa框架传递协议的方式。如果我没有正确使用单词,请原谅,因为机器可能会将其解释为HTML。
@protocol(MyProtocol)varname
对我甚至都无法编译。 - Millie Smith
NSString
)一样;因此,对于一个协议实例,您必须有一个明确的指针。 - jscsClass
不是一个类,它是一种类型,表示指向类的指针,就像id
表示指向对象的指针一样。 - Chuck