2011-07-17 16 views
7

Mientras trabajaba en el filtrado de mi NSMutableDictionary basado en la entrada del usuario, he creado el siguiente código:NSPredicar predicateWithFormat: (NSString *) incoherencia?

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

"searchString que" se pasa al método con esta definición:

(NSString*) searchString 

Sin embargo, esto dio lugar a la siguiente excepción:

... levantó [valueForUndefinedKey:]: esta clase es valor no clave de codificación compatible para el ke Y ...

La solución resultó ser:

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

Lo que no entiendo, es por eso que este último trabajó, y la antigua lanzó la excepción. He leído un poco en key value coding, pero no entiendo cómo se aplica aquí. (es decir, solo cambiando la forma en que se define NSPredicate) ¿Puede alguien aclararme?

Actualización: En respuesta al comentario de jtbandes, continué y creé un proyecto de TestApp para probar este problema. http://dl.dropbox.com/u/401317/TestApp1.tar.gz

+0

Realmente tendrá que mostrarnos la excepción completa si espera que descubramos qué significa. – jtbandes

Respuesta

17

La respuesta es in the predicate programming guide.

constantes de cadena deben ser citados en las cotizaciones de expresión individuales y dobles son ambas aceptables, ... Si utiliza la sustitución de variables utilizando% @ ..., se añaden las comillas de forma automática. Si utiliza las constantes de cadena dentro de su cadena de formato, se debe citar a usted mismo

[el énfasis es mío]

predicateWithFormat pone las comillas en para usted, pero stringWithFormat no lo hace. Su primer ejemplo probablemente funcionaría si hiciera esto:

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

De hecho, las citas solucionan el problema. Lanzar una excepción "valueForUndefinedKey" solo parece llevar al desarrollador por el camino equivocado, supongo. (La sintaxis de Predicate inválida sería mejor, creo) Tal vez es solo mi inexperiencia con Objective-c. – yanigisawa

+0

@yanigisawa: aunque no es una sintaxis no válida. Si no hay comillas, asume que es una clave KVC, por lo que está comparando el valor de una clave con otra. En esas circunstancias, la excepción tiene sentido. – JeremyP

+0

De acuerdo, lo atribuiré a que no tengo experiencia con estos errores de compilación y tiempo de ejecución. Gracias por tu ayuda. – yanigisawa

Cuestiones relacionadas