2012-07-13 8 views
5

Me rindo. He probado todas las combinaciones que puedo imaginar para verificar si una cadena contiene otra cadena. He aquí un ejemplo de la sintaxis intuitiva que describe lo que quiero hacer:Use un NSPredicate para detectar NO CONTIENE

NSPredicate* pPredicate = [NSPredicate predicateWithFormat:@"NOT (%K CONTAINS[c] %@)", 
NSMetadataItemFSNameKey, 
[NSString stringWithFormat:@"Some String"]]; 

Independientemente de cómo me muevo alrededor del NO, utilice el! operador, cambie el paréntesis o elimínelos por completo, siempre obtengo una excepción al analizar esta expresión.

¿Qué pasa con esta expresión?

EDIT: La excepción ocurre cuando llamo

[pMetadataQuery setPredicate:pPredicate]; 

y la excepción es: * Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: 'Tipo desconocido de NSComparisonPredicate dado a NSMetadataQuery (kMDItemFSName CONTIENE [c] "un trozo de cuerda")'

+0

duplicado posible de esta pregunta: http://stackoverflow.com/questions/8580715/nsarray-with-nspredicate-using-not-in – joern

+0

Puede decirnos lo que el la excepción es? – Tommy

+0

joern, he visto muchas preguntas similares, pero al igual que esa, no responde mi problema. "IN" no es lo mismo que contiene, ya que involucra conjuntos (según lo entiendo). @Tommy, actualicé la pregunta. Espero que eso ayude. – vargonian

Respuesta

10

tuve éxito completo con:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"NOT (%K CONTAINS[c] %@)", 
     @"someKey", 
     [NSString stringWithFormat:@"Some String"]]; 
NSArray *testArray = 
    [NSArray arrayWithObjects: 
     [NSDictionary dictionaryWithObject:@"This sure is Some String" forKey:@"someKey"], 
     [NSDictionary dictionaryWithObject:@"I've nothing to say" forKey:@"someKey"], 
     [NSDictionary dictionaryWithObject:@"I don't even have that key" forKey:@"someOtherKey"], 
     nil]; 

NSArray *filteredArray = [testArray filteredArrayUsingPredicate:predicate]; 
NSLog(@"found %@", filteredArray); 

Los dos segundos objetos de los tres en testArray terminaron en filteredArray, en OS X v10.7 y iOS v4.3. Entonces, el problema no es el predicado, lo que técnicamente es una respuesta completa a la pregunta, es una especie de restricción en NSMetadataQuery. Tristemente no tengo experiencia en esa área, pero sin duda es lo siguiente a investigar.

+0

Gracias, Tommy. Google produce un resultado aparentemente relacionado porque es una limitación de NSMetadataQuery, que supuestamente se resolvió usando "IN" en lugar de "CONTAINS", pero eso obviamente suena incorrecto, ya que los documentos son explícitos acerca de que CONTAINS es para cadenas y IN para diccionarios, etc. – vargonian

+0

Estoy marcando esto como una respuesta ya que, aunque no resuelve mi problema, mi pregunta fue engañosa. – vargonian

1

Swift 3,0

let predicate = NSPredicate(format: "NOT (%K CONTAINS[c] %@)", "someKey", "Some String") 
let testArray: [Any] = [[ "someKey" : "This sure is Some String" ], [ "someKey" : "I've nothing to say" ], [ "someOtherKey" : "I don't even have that key" ]] 
let filteredArray: [Any] = testArray.filter { predicate.evaluate(with: $0) } 
print("found \(filteredArray)") 
Cuestiones relacionadas