使用for in循环迭代实现相同协议的不同类的NSArray



我有一个方法,在这个方法中,我实例化了一个对象数组,这些对象都是从同一协议派生的。我想知道我是否可以遍历数组,然后执行它们的公共协议方法。

伪代码
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

最新更新