2013-03-19 11 views
8

Perché il primo dei frammenti successivi funziona mentre non il secondo?Creazione di NSPredicate in modo dinamico impostando la chiave a livello di programmazione

Snippet 1

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(coin_unique == %@)", [NSNumber numberWithInt:species]]; 

Snippet 2

// Does NOT Work 
NSString *predicateText = @"coin_unique"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ == %@)", predicateText, [NSNumber numberWithInt:species]]; 

devo creare in modo dinamico a seconda predicato l'argomento ha ricevuto nel mio metodo.

risposta

18

coin_unique è una chiave, quindi ha bisogno l'identificatore di formato %K:

NSString *predicateText = @"coin_unique"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K == %@)", predicateText, [NSNumber numberWithInt:species]]; 

La sintassi formato è descritto molto bene here.

0

Ho ricevuto il seguente errore anche se il mio NSPredicate è stato formattato correttamente.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Insufficient arguments for conversion characters specified in format string.' site:stackoverflow.com 

Come uno stupido ho dimenticato di passare un secondo argomento al formato predicato (perché ci sono stati due %@). Cioè NSPredicate(format:predicateFormat,argumentArray:[Date()]) ha un solo elemento nell'array quando deve essere due: [Date(), Date()]

Problemi correlati