2013-12-11 38 views
-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 

    } 

} 

要執行有沒有辦法讓ŧ他的那種行爲?

+0

爲什麼downvote? – GeneralMike

回答

0

另一種方法是創建一個單一的超類,我希望使用此方法繼承所有類。然後我可以循環使用那個超類。

所以,如果我想成爲能夠環路MyObject1MyObject2,我可以創造一個BigSuperClass,其中MyObject1MyObject2BigSuperClass兩個子類。

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

    for (BigSuperClass *obj in arr) 
    { 

     // Do stuff 

    } 

} 

這個循環應該適用於MyObject1對象,MyObject2對象的數組,或BigSuperClass對象的數組的數組。

我一直在想這個問題越多,我越傾向於這是最好的方法。因爲我可以設置我的BigSuperClass以及所有@property和我感興趣的方法作爲我的// Do Stuff的一部分,這意味着我不必檢查respondsToSelector與其他答案一樣。這種方式感覺不太脆弱。

0

我在提出這個問題的時候提出了一個想法,認爲我不妨完成它。我只需要改變我在做循環的過程,而我並不需要派上課。

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

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

     // Do stuff 

    } 

} 

我應該注意到我// Do stuff的那部分被檢查,以確保if ([[arr objectAtIndex:i] respondsToSelector:...])之前,我確實嘗試用它做任何事情 - 從我的理解應該避免任何討厭的崩潰。

2

我沒有看到太多的方法將class傳遞給該方法。運行你的循環:

for (id obj in arr) { 

並檢查你想調用的方法是否存在。如果你想檢查數組中的對象是否真的屬於那個類,那麼傳遞這個類只是非常有用,但是你不能用這些信息做很多事情。