我有一个方法,在这个方法中,我实例化了一个对象数组,这些对象都是从同一协议派生的。我想知道我是否可以遍历数组,然后执行它们的公共协议方法。
伪代码NSArray *implementations = @[/*Impl1, impl2, impl3 instantiated here*/]
for (__________ * impl in implementations){
[impl protocolMethod]
}
我的问题主要是我不知道如何在for-in循环中定义空白对象的类型,因为它们都是不同的类。我能想到的最接近的是"id",但这似乎不是一个有效的类型,因为我得到"指向没有显式所有权的非const类型的指针"。
可以是这样的:
for (NSObject<MyProtocol>* impl in implementations)
[impl protocolMethod]
或者
for (id<MyProtocol> impl in implementations)
[impl protocolMethod]
我通常使用第一种形式,因为它在编译时更安全。
假设您的协议是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
。