【问题标题】:Pass a protocol as a method argument将协议作为方法参数传递
【发布时间】:2011-11-21 11:40:22
【问题描述】:

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

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

我想要将一个协议传递给一个方法,就像我可以将一个类传递给一个方法一样(以下内容不正确,但它希望能解释我想要做什么):

-(void)someMethod:(Protocol)someArgument;

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

【问题讨论】:

    标签: objective-c methods protocols arguments


    【解决方案1】:

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

    + (BOOL)conformsToProtocol:(Protocol *)aProtocol
    

    【讨论】:

      【解决方案2】:

      如果您在编码时知道协议的名称,请使用 @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:

      【讨论】:

      • 谢谢。那么出于兴趣,为什么 Protocol 使用指针而 Class 不使用?
      • 恐怕我自己没有答案。不过,这是个好问题。
      • 协议和类都由它们自己的类表示。不同之处在于,word Classdefined as being a pointer,但 Protocol 只是类的名称,就像其他任何名称一样(NSString,例如);所以对于Protocol instance,你必须有一个明确的指针。 @1nd
      • @1ndivisible:Protocol 是一个类,就像 NSString 或 NSArray。 Class 不是一个类,它是一种表示指向类的指针的类型,就像id 表示指向对象的指针一样。
      【解决方案3】:

      我不建议使用协议。它将掩盖您的代码实际依赖的接口。使用id&lt;yourprotocol&gt;*。这实际上是可可框架传递协议的方式。如果我不认为我正在尝试做 HTML,请原谅使用单词。

      【讨论】:

      • 这也是一种强类型语言,所以不要试图让它表现得松散类型
      • 这是否决票,因为这不是 OP 想要的?这就是我想要的...@protocol(MyProtocol)varname 甚至没有为我编译。
      【解决方案4】:
      - (void) executeRequest:(id<Protocol1>)request andCompletion:(id<Protocol2>)response
      

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

      因为 id<..> 意味着它需要在传递参数之前符合该协议

      【讨论】:

      • 完美,这点别人没提
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2010-11-16
      相关资源
      最近更新 更多