-2

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

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

    }

}

有没有办法获得这种行为?

4

3 回答 3

2

class我认为将 传递给该方法没有多大意义。运行你的循环:

for (id obj in arr) {

并检查您要调用的方法是否存在。仅当您想检查数组中的对象是否实际上属于该类时,传递该类才真正有用,但是您无法对这些信息做太多事情。

于 2013-12-11T21:56:19.340 回答
0

我在输入这个问题时想出了一个主意,我想我不妨完成它。我只需要改变我的循环方式,我真的不需要在课堂上发送。

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

    for (int i=0; i < [arr count]; i++)
    {

        // Do stuff

    }

}

我应该注意到,在我实际尝试对它做任何事情之前,我的一部分// Do stuff是检查以确保if ([[arr objectAtIndex:i] respondsToSelector:...])- 据我所知,这应该可以防止任何令人讨厌的崩溃。

于 2013-12-11T21:52:48.433 回答
0

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

因此,如果我希望能够循环 for MyObject1and MyObject2,我可以创建一个BigSuperClass, whereMyObject1MyObject2都是BigSuperClass.

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

    for (BigSuperClass *obj in arr)
    {

        // Do stuff

    }

}

这个循环应该适用于MyObject1对象数组、MyObject2对象数组或对象数组BigSuperClass

我对此思考得越多,我就越倾向于这是最好的方法。因为我可以使用我感兴趣的BigSuperClass所有s 和方法来设置 my ,这意味着我不必像其他答案一样检查。这种方式只是感觉不那么脆弱。@property// Do StuffrespondsToSelector

于 2013-12-11T21:58:29.340 回答