2013-12-11 2 views
-2

나는 내가 원하는 것을 설명하는 방법을 정확히 정말 모르겠어요 - 내가 할 수있는 최선은 예를 들어 일부 코드를 제공 할 수 있습니다 :

- (void) doStuffInLoopForDataArray:(NSArray *)arr forObjectsOfClass:(NSString *)class 
{ 

    for ([class class] *obj in arr) 
    { 

     // Do stuff 

    } 

} 

그래서 호출 할 수 이런 내가

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

    for (NSString *obj in arr) 
    { 

     // Do KVC stuff 

    } 

} 

을 쓴 것처럼

NSArray *arr = [NSArray arrayWithObjects:@"foo",@"bar", nil]; 
[self doStuffInLoopForDataArray:arr forObjectsOfClass:@"NSString"]; 

내가 코드를 기대는 t을 얻을 수있는 방법이 있나요 실행되는 행동의 그의 종류?

+0

왜 downvote? – GeneralMike

답변

0

또 다른 방법은 상속을 위해이 메서드를 사용하려는 모든 클래스가 하나의 수퍼 클래스를 만드는 것입니다. 그런 다음 해당 수퍼 클래스를 사용하여 루프 할 수 있습니다.

그래서 MyObject1MyObject2에 대한 루프 할 수 있도록하려면, 나는 MyObject1MyObject2BigSuperClass 모두 서브 클래스된다 BigSuperClass을 만들 수 있습니다.

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

    for (BigSuperClass *obj in arr) 
    { 

     // Do stuff 

    } 

} 

이 루프는 MyObject1 객체, MyObject2 객체의 배열, 또는 BigSuperClass 객체의 배열의 배열을 위해 일해야한다.

더 많은 것을 생각해봤을수록, 나는 이것이 최선의 접근 방법이 될 것으로 기대하고 있습니다. 이후 모든 @property과 내 // Do Stuff의 일부로 관심이있을 것이라고 내 BigSuperClass을 설정할 수 있습니다. 즉, 다른 답변과 마찬가지로 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) { 

그리고 호출 할 메소드가 있는지 확인하십시오. 클래스를 전달하는 것은 배열의 객체가 실제로 해당 클래스에 있는지 확인하려는 경우에만 유용하지만 그 정보로는 그다지 많은 작업을 수행 할 수 없습니다.