通过for循环遍历实现相同协议的不同类的NSArray

时间:2015-07-23 17:27:44

标签: ios objective-c

我有一个方法,我实例化一个对象数组,这些对象都是从同一个协议派生的。我想知道我是否可以迭代数组,然后执行它们的通用协议方法。

伪代码

NSArray *implementations = @[/*Impl1, impl2, impl3 instantiated here*/]
  for (__________ * impl in implementations){
    [impl protocolMethod]
}

我的问题主要在于我不知道如何在for-in循环中定义该空白对象的类型,因为它们都是不同的类。我能想到的最接近的是" id"但这似乎不是一个有效的类型,因为我得到了#34;指向没有明确所有权的非const类型。"

2 个答案:

答案 0 :(得分:4)

可能是这样的:

for (NSObject<MyProtocol>* impl in implementations)
    [impl protocolMethod]

甚至

for (id<MyProtocol> impl in implementations)
    [impl protocolMethod]

我通常使用第一种形式,因为它的编译时安全性更高。

答案 1 :(得分:1)

我们说你的协议是P。然后您可以使用NSObject<P> *类型,如下所示:

@protocol P <NSObject>
-(void)foo;
@end

@interface A : NSObject<P>
@end

@interface B : NSObject<P>
@end

@implementation A
-(void)foo {
    NSLog(@"A");
}
@end

@implementation B
-(void)foo {
    NSLog(@"B");
}
@end
...
NSArray *a = @[[[A alloc] init], [[B alloc] init]];
for (NSObject<P> *i in a) {
    [i foo];
}

以上代码段记录AB