循环遍历一组动态对象

时间:2013-12-11 21:52:48

标签: ios objective-c kvc

我不确定如何描述我想要做的事情 - 我能做的最好就是提供一些代码作为例子:

- (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

    }

}

有没有办法实现这种行为?

3 个答案:

答案 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)

另一种方法是创建一个单一的超类,我想用这个方法继承所有类。然后我可以使用那个超类循环。

因此,如果我希望能够循环MyObject1MyObject2,我可以创建BigSuperClass,其中MyObject1MyObject2都是子类BigSuperClass

- (void) doStuffInLoopForDataArray:(NSArray *)arr
{

    for (BigSuperClass *obj in arr)
    {

        // Do stuff

    }

}

此循环应适用于MyObject1个对象的数组,MyObject2个对象的数组或BigSuperClass个对象的数组。

我越是想到这一点,我越倾向于这是最好的方法。由于我可以将BigSuperClass和我感兴趣的所有@property和方法设置为// Do Stuff,因此我无需检查respondsToSelector和其他答案一样。这种方式感觉不那么脆弱。