2010-06-14 17 views
18

Veri tabanı sınıfındaki "Foo" adlı NSMutableArray * çocuğuna sahip olduğum, "Bar1" ve "Bar2" gibi bir çok sınıfın üst sınıfı. Bu dizi, Bar1 ve Bar2 nesnelerini Foo'dan alt sınıfların ağaç benzeri özyinelemeli alt yapısını elde edecek şekilde depolar. Objective-C foreach döngüsü kullanarak içlerinden ben döngü, dizideki nesneleri erişmek için:Objective-C NSMutableArray - çoklu sınıf nesnelerine sahip foreach döngüsü

for(Foo *aFoo in children) { 
    ... 
} 

Ama çoğu zaman sadece bu, belli bir sınıf var dizide nesneler aracılığıyla döngü gerekir vaka Ben dizi çocuklarda Bar1 sınıfının her nesne için bir görev yapmak istiyorum. (Bar1 * anObject öğesinde) için kullanıldığında, yalnızca TÜM nesnelerle değil, yalnızca Bar1 sınıfı olanlarla döngülenir. İhtiyacım olanı elde etmenin bir yolu var mı?

cevap

40

Tüm nesnelerin üstesinden gelmek ve döngünün içinde bir tür denetimi yapmak zorundasınız.

for(id aFoo in children) { 
    if ([aFoo isKindOfClass:[Bar1 class]]) 
     ... 
    } 
} 
+1

Bu oldukça bellek pahalı olabilir, ancak görünüşe göre başka yolu yoktur. Teşekkürler –

+5

hayır, bellek ayak izinizi değiştirmiyor, sadece bellekte neler olduğunu okuyorsunuz – unbeli

+3

Genelde, bir koleksiyondaki sınıflar arasında ayrım yapmak için 'isKindOfClass:' öğesini kullanmanız gerekiyorsa, tasarım deseniniz normalin dışında. Koleksiyonunuz tamamen sizin oluşturduğunuz sınıfların örneklerini içeriyorsa, bu özellikle doğrudur. – bbum

9

Böyle bir şey yapabilirsiniz:

NSPredicate* bar1Predicate = [NSPredicate predicateWithFormat:@"SELF.class == %@", [Bar1 class]]; 
NSArray* bar1z = [children filteredArrayUsingPredicate:bar1Predicate]; 
for(Bar1* bar in children) { 
    // do something great 
} 

Bu sınıf kümeleri kullanmak vb NSString, NSNumber gibi birçok standart Kakao sınıflar ile çalışmaz Ancak, dikkat etmek önemlidir veya sınıflar tam olarak eşleşmeyeceği için özel uygulama sınıfları (örneğin, bir CoreFoundation tipi ile köprülenmeyen herhangi bir şey). Ancak bu, sınıfın gerçekten Bar1'in bir örneği olduğu sürece tanımladığınız sınıflarla çalışacaktır.

Vurgu Not: Kullanıcı @Alex, sınıfların yukarıdaki notumdan tam olarak eşleşmesi gerektiği açık olmayabilir, bu yüzden bunu yeniden düzenliyorum. Sınıflar çalışmak için bu filtrenin tam olarak eşleşmesi gerekir, bu yüzden Bar1 alt sınıfını veya bir proxy sınıfı sağladığınızda, bu sınıfların dahil edilmesi için filtreyi ayarlamanız gerekir. Yazıldığı gibi, sadece örnekleri Bar1 filtrelenmiş diziye gönderilir.

+0

da, bu iPhone üzerinde mevcut değil düşünüyorum – unbeli

+2

@unbeli: Bu kesinlikle iPhone iPhone, iPhone belirtilen tüm değil. –

+0

Ancak, Bar1'in alt sınıfını kullanırsanız, bu kod alt sınıfın nesneleriyle eşleşmez. OP alt sınıflar hakkında bir şey söylemez, ancak not etmek önemlidir. – Alex

İlgili konular