假设我已经定义了自己的协议并将其命名为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();
}
答案 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"];
}
}