2011-07-17 22 views
7

kullanıcı girişi dayalı benim NSMutableDictionary filtreleme üzerinde çalışırken, ben aşağıdaki kodu oluşturuldu:NSPredicate priefateWithFormat: (NSString *) tutarsızlığı?

NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] %@", searchString]; 
NSPredicate *pred = [NSPredicate predicateWithFormat:predicateString]; 
NSArray *filteredKeys = [[myMutableDictionary allKeys] filteredArrayUsingPredicate:pred]; 

"searchString" Bu tanımda ile yöntemle geçirilir: Ancak bu sonuçlanmıştır

(NSString*) searchString 

aşağıdaki istisna: Bu sınıf ke için değil anahtar değeri kodlama uyumlu olup:

... [valueForUndefinedKey:] kaldırdı düzeltme çıktı

y ... olmak:

anlamıyorum ne
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF beginsWith[cd] %@", searchString]; 
NSArray *filteredKeys = [[myMutableDictionary allKeys] filteredArrayUsingPredicate:pred]; 

, ikincisi çalıştı neden olduğunu ve istisna attı eski. key value coding'da biraz okumuştum, ancak bunun nasıl uygulandığını anlamıyorum. (yani sadece NSPredicate'in nasıl tanımlandığı değiştirilerek) Birisi beni aydınlatabilir mi?

Güncelleme: jtbandes yorumuna yanıt olarak, bu soruna yönelik bir TestApp projesi oluşturdum. http://dl.dropbox.com/u/401317/TestApp1.tar.gz

+0

Bunun ne anlama geldiğini anlayabilmemiz için bize bir istisna göstermeniz gerekir. – jtbandes

cevap

17

Yanıt in the predicate programming guide.

dize sabitleri size% @ ... kullanarak değişken değişimi kullanırsanız hem kabul edilebilir, ... , tırnak işaretleri otomatik olarak sizin için eklenen ifadesi-tek ve çift tırnak içinde olan tırnak içinde olmalıdır. Eğer biçim dize içinde dize sabitleri kullanırsanız, bunları alıntı gerekir Kendinizi

[vurgu benim]

predicateWithFormat sizin için de tırnak koyar, ancak stringWithFormat yapmaz. İlk örneğiniz muhtemelen bunu yaparsanız muhtemelen işe yarar:

NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] '%@'", searchString]; 
//                   ^^ single or double quotes 
+0

Gerçekten de, teklifler sorunu çözüyor. Bir "valueForUndefinedKey" istisnası atmak, geliştiriciyi yanlış yolun aşağısına götürmek gibi görünüyor. (Geçersiz Predicate sözdizimi daha iyi olurdu bence) Belki de sadece benim hedef-c ile benim deneyimsizliğim. – yanigisawa

+0

@yanigisawa: Bu geçersiz sözdizimi olsa da. Tırnak yoksa, bir KVC anahtarı olduğunu varsayar, böylece bir anahtarın değerini diğerine karşı karşılaştırırsınız. Bu koşullar altında, istisna mantıklı. – JeremyP

+0

Pekala, bu derleyici ve çalışma zamanı hatalarıyla deneyimsizliğim için öğreteceğim. Yardım ettiğin için teşekkür ederim. – yanigisawa