2009-09-17 16 views
50

Özel bir sınıfın nesnelerinden oluşan bir NSArray ürünüm var. Sınıf 3 (şehir, eyalet, zip) dizesi özelliklerine sahiptir. Tüm benzersiz durum değerlerini array'dan almak istiyorum.iPhone - NSArray nesnesinden benzersiz değerler almak

NSPredicate sınıfını okudum, ancak bu durumda nasıl kullanılacağını pek yapamadım. Bulduğum tek örnek, string işlemleri içindi.

Birisi bana yardım edebilir mi?

cevap

117

tamamen basit bir liner:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]]; 

hile NSArray ait valueForKey: yöntemidir. Bu, dizi (myArrayOfCustomObjects) boyunca yineleyecek, her bir nesnede -state yöntemini arayacak ve sonuçların bir dizisini oluşturacaktır. Daha sonra, çoğaltmaları kaldırmak için sonuç durumları dizisiyle birlikte bir NSSet oluştururuz.


iOS 5 ve OS X 10.7 ile başlayarak, hem de bunu yapabilirsiniz yeni sınıf var: NSOrderedSet. Sıralı bir kümenin avantajı, herhangi bir kopyayı kaldıracağı, ancak göreceli siparişi koruyacağıdır.

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"]; 
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states]; 
NSSet *uniqueStates = [orderedSet set]; 
+0

ederken ben de dolayısıyla @distinctUnionOfObjects gücü ve, probablyCorey verdiği cevap kullanıcı, bu çözümde burada bu özlü yaklaşımla yarar gibi sipariş korunur. – idStar

134

keypaths'a bakın. Süper güçlüler ve çoğu zaman NSPredicate sınıfları yerine kullanıyorum. İşte valueForKeyvalueForKeyPath yerine ait

NSArray *uniqueStates; 
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"]; 

Not kullanımı ... Eğer örnekte bunları kullanmak nasıl olduğunu. İşte

daha detaylı/yapmacık örnektir

...

NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil]; 
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil]; 
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil]; 
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil]; 

NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil]; 

NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]); 

// OUTPUT 
// Unique States: 
// "california", 
// "michigan", 
// "new york" 
+17

Caveat: valueForKeyPath: @ "distinctUnionOfObjects.PROPERTY" sıralama düzenini korumaz. –

+0

teşekkürler @RobertAltman, bunu belirtmek için. Sanırım bu, bazı hata ayıklama zamanını kurtardı – Hulvej

+0

Anahtarın nesnesi bir dizidir ve değer ilk dizinde varsa ne olur? –

İlgili konular