2010-06-22 4 views
0

동일한 메시지를 보내려는 여러 클래스가 있습니다. 더 명확하게하기 :동일한 메시지를 여러 ObjC 클래스에 전달

doX : withClass : 동일한 매개 변수를 사용하여 여러 클래스에 보내고 싶습니다. 아마도 코드는 명확하게 다음과 같습니다

+ (void)doX:(NSString *)blah { 
    [Utility doX:blah withClass:[Foo class]]; 
    [Utility doX:blah withClass:[Bar class]]; 
    [Utility doX:blah withClass:[Baz class]]; 
    [Utility doX:blah withClass:[Garply class]]; 
} 

을 내가 특정 프로토콜합니다 (DOX 구현하는 클래스에 비슷한 할 세 가지 방법이 있습니다 그것을 구현하는 클래스가 주어진 것으로 가정 방법은 여러 단계를 수행합니다 withClass를 그러한 프로토콜).

제 질문은 어떻게하면 프로그래밍 방식으로 클래스를 반복 할 수 있습니까? 그래서 간단히 목록에 코드를 추가하여 루프에 추가 할 수 있습니다.

답변

4

나의 제안은 NSArrayClass의 물체를 통과하는 것입니다 :

[Utility doX:blah withClasses:[NSArray arrayWithObjects:[Foo class], [Bar class], [Baz class], [Garply class], nil]]; 

-(void) doX:(Blah) blah withClasses:(NSArray *) classes { 
     //[classes makeObjectsPerformSelector:@selector(doX:) withObject:blah] 
     for(Class *someClass in classes) { 
     [Utility doX:blah withClass:someClass]; 
     } 
} 
+1

본문을'[클래스 makeObjectsPerformSelector : @selector (doX :) withObject : blah]'로 변경할 수 있습니다. – mipadi

+0

글쎄, 나는 클래스가 선택자를 수행하는 것을 원하지 않는다; 유틸리티 클래스가 클래스를 인수로 사용하여 메서드를 실행하도록합니다. 이는 작동중인 객체가 특정 인터페이스를 구현하는 클래스에서 Utility 클래스가 수행해야하는 동작에서 간단하고 추상적으로 유지해야하기 때문입니다. 고마워, - 클래스가 배열에 직접 추가 될 수 있다는 것을 알지 못했다. 나는 그들이 어떻게 든 캡슐화되어야한다고 생각했습니다. –

+0

@Andrew, 대답을 업데이트했습니다. –

1

는 확실하지 당신은 정말 여기에 루프합니다.

나는 아마 doX를 정의하는 기본 클래스를 확장하기 위해 Foo, Bar, Baz 및 Garply를 사용하려고했습니다. 그런 다음 기본 클래스에서 변경 사항을 관찰하고 doX를 호출 할 수 있습니다. 하지만 어쩌면 당신이하려는 것을 이해하지 못할 수도 있습니다.

관련 문제