我不确定如何描述我想要做的事情 - 我能做的最好就是提供一些代码作为例子:
- (void) doStuffInLoopForDataArray:(NSArray *)arr forObjectsOfClass:(NSString *)class
{
for ([class class] *obj in arr)
{
// Do stuff
}
}
所以我可以称之为
NSArray *arr = [NSArray arrayWithObjects:@"foo",@"bar", nil];
[self doStuffInLoopForDataArray:arr forObjectsOfClass:@"NSString"];
我希望代码可以像我写的那样执行
- (void) doStuffInLoopForDataArrayOfStrings:(NSArray *)arr
{
for (NSString *obj in arr)
{
// Do KVC stuff
}
}
有没有办法实现这种行为?
答案 0 :(得分:2)
我没有看到将class
传递给方法的重点。运行你的循环:
for (id obj in arr) {
并检查要调用的方法是否存在。如果你想检查数组中的对象是否真的属于那个类,那么传递类只是非常有用,但你不能对这些信息做很多事情。
答案 1 :(得分:0)
- (void) doStuffInLoopForDataArray:(NSArray *)arr
{
for (int i=0; i < [arr count]; i++)
{
// Do stuff
}
}
我应该注意到// Do stuff
的一部分正在检查以确保if ([[arr objectAtIndex:i] respondsToSelector:...])
在我真正尝试对它做任何事情之前 - 并且据我所知,这应该可以防止任何令人讨厌的崩溃。
答案 2 :(得分:0)
另一种方法是创建一个单一的超类,我想用这个方法继承所有类。然后我可以使用那个超类循环。
因此,如果我希望能够循环MyObject1
和MyObject2
,我可以创建BigSuperClass
,其中MyObject1
和MyObject2
都是子类BigSuperClass
。
- (void) doStuffInLoopForDataArray:(NSArray *)arr
{
for (BigSuperClass *obj in arr)
{
// Do stuff
}
}
此循环应适用于MyObject1
个对象的数组,MyObject2
个对象的数组或BigSuperClass
个对象的数组。
我越是想到这一点,我越倾向于这是最好的方法。由于我可以将BigSuperClass
和我感兴趣的所有@property
和方法设置为// Do Stuff
,因此我无需检查respondsToSelector
和其他答案一样。这种方式感觉不那么脆弱。