2012-05-08 24 views
11

NSDray nesnelerinin NSArray'ım var. Diziyi NSPredicate kullanarak sözlüklerin anahtarlarına göre filtrelemek istiyorum. Böyle bir şey yapıyor:NSPredicate kullanılarak NSDictionary nesnelerinin NSArray süzülmesi

NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate]; 

geçirilen onlar anahtar tek kelimelik ise bu iyi çalışır: Renk, İsim, Yaş. Ancak, anahtar çok kelimelidir, örneğin: Kişi Yaşı, Kişi Adı.

Temel olarak, bir boşluk içeren herhangi bir anahtar işe yaramıyor. Dize içinde anahtarın etrafında tek tırnaklar koymaya çalıştım, tıpkı değer tarafında yapıldığı gibi, ama bu da işe yaramadı. Ayrıca çift tırnak çalıştı, ama boşuna.

Lütfen bunu bildiriniz. Şimdiden teşekkürler.

+2

deneyin% K - bu çekirdek verilerinde çalışma gayet – user170317

+0

[çalışmıyor NSPredicate biçim dizesi] (olası yinelenen http://stackoverflow.com/questions/12413929/nspredicate-format -string-doesnt-work) – Monolo

cevap

16

Dinamik anahtar kullanırken, belirtecini %@ yerine kullanmalısınız. Ayrıca, değer jetonunun çevresindeki alıntıları da istemezsiniz. Onlar sizin yüklemenizin value'a karşı yerine @"%@" literal dizgisine karşı eşitlik testi yapmasına neden olurlar.

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value]; 

Bu

Predicate Format String Syntax guide belgelenmiştir.


Düzenleme: Anum Amin işaret ettiği gibi, +[NSString stringWithFormat:] yüklem biçimlerini işlemez. Bunun yerine [NSPredicate predicateWithFormat:@"%K == %@", key, value] olmasını istiyorsunuz.

+5

NSString,% K'yi doğru olarak değiştirmeyecektir. Biri kullanmalısınız [NSPredicate predicateWithFormat:] '. Cevabımı aşağıya bakın. – NightFury

+0

@AnumAmin: Kesinlikle haklısınız. Sanırım, Bittu'nun kodunu taze oluşturmak yerine "düzeltmek" için uğraştığım şey bu. Hatta cevapımı olduğu gibi kabul ettiğine şaşırdım. –

+0

Zaten NSPredicate predicateWithFormat kullanıyordum: bu nedenle, bir NSString oluşturmak için ayrı bir deyim yerine bu deyimde bunu yapmak kolaydı. Bir açıklamada açıklığa kavuşmuş olmalıydım ama Anum bunu iyi yaptı :) – Bittu

23

Benim için Kevin'in cevabı işe yaramadı. Ben kullandı:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself 
     NSLog(@"predicate %@",predicateString); 
     filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]]; 
+0

Evde oynayanlar için opsiyonel [cd] 'size hem vaka hem de aksaklık-duyarsızlık verir. – smacdonald