目标C,关于迭代协议变量的问题

时间:2011-03-14 00:12:11

标签: objective-c protocols

假设我已经定义了自己的协议并将其命名为NeighborNodeListener。 我有NSMutableArray持有实现协议的对象。 现在,我想遍历NSMutalble数组并调用协议中为数组中的所有对象定义的方法之一。

 for(id <NeighborNodeListener> object in listeners){
      [object firstMethod];//first method is defined in the protocol 
 }

我正在考虑做一些这样的事情,但它不起作用。 我想在Objective C中做的代码在Java中看起来像这样

 List<NeighborNodeListener> listeners = new ArrayList<NeighborNodeListener>();
 Iterator<NeighborNodeListener> iter = listeners.iterator();
 while (iter.hasNext()) {
      iter.next().firstMethod();
 }

1 个答案:

答案 0 :(得分:4)

在键入方面,Objective-C的严格程度不如Java,因此您需要在运行时进行检查。

请注意,下面的两个代码块执行相同的操作 - 除了第一个检查object以完全符合协议,而后者只检查您要调用的方法。

for (id object in listeners)
{
  if ([object conformsToProtocol:@protocol(myProtocol)])
  {
    [object firstMethod];//first method is defined in the protocol
  }
  else
  {
    [NSException raise:NSInternalInconsistencyException format:@"objects in the listeners array must confirm to myProtocol"];
  }
}

或者,

for (id object in listeners)
{
  if ([object respondsToSelector:@selector(firstMethod)])
  {
    [object firstMethod];//first method is defined in the protocol
  }
  else
  {
    [NSException raise:NSInternalInconsistencyException format:@"objects in the listeners array must confirm to myProtocol"];
  }
}