Цель C, Вопрос об итерации по переменным протокола - PullRequest
4 голосов
/ 14 марта 2011

Допустим, я определил свой собственный протокол и назвал его 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 Ответ

4 голосов
/ 14 марта 2011

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"];
  }
}
...