2010-06-22 57 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

我的建議是通過ClassNSArray對象:

[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 2010-06-22 18:40:43

+0

嗯,我不想讓這些類執行一個選擇器;我希望Utility類運行一個將Class作爲參數的方法。這是因爲它所運行的對象需要保持簡單並且從我希望Utility類在實現該特定接口的類上執行的行爲中抽象出來。 謝謝,雖然 - 我沒有意識到類可以直接添加到數組;我認爲他們不得不以某種方式封裝。 – 2010-06-22 20:31:07

+0

@安德魯,我更新了我的答案。 – 2010-06-22 20:36:55

1

不知道你真的想在這裏循環。

如果是我,我可能會嘗試讓Foo,Bar,Baz和Garply擴展一些定義doX的基類。然後你可以讓你的基類觀察等號並在它改變時調用doX。但也許我不明白你想要做什麼。