我有一个方法,我实例化一个对象数组,这些对象都是从同一个协议派生的。我想知道我是否可以迭代数组,然后执行它们的通用协议方法。
伪代码
NSArray *implementations = @[/*Impl1, impl2, impl3 instantiated here*/]
for (__________ * impl in implementations){
[impl protocolMethod]
}
我的问题主要在于我不知道如何在for-in循环中定义该空白对象的类型,因为它们都是不同的类。我能想到的最接近的是" id"但这似乎不是一个有效的类型,因为我得到了#34;指向没有明确所有权的非const类型。"
答案 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];
}
以上代码段记录A
,B
。