2012-07-13 11 views
5

Mi arrendo. Ho provato ogni combinazione che posso immaginare per verificare se una stringa contiene un'altra stringa. Ecco un esempio di sintassi intuitiva descrivere quello che voglio fare:Utilizzare un NSPredicate per rilevare NOT CONTAINS

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

Indipendentemente da come sposto il non intorno, utilizzare il! operatore invece, sposta le parentesi o rimuovile del tutto, ottengo sempre un'eccezione analizzando questa espressione.

Cosa c'è di sbagliato in questa espressione?

EDIT: L'eccezione avviene quando chiamo

[pMetadataQuery setPredicate:pPredicate]; 

e l'eccezione è: * terminazione app causa eccezione non identificata 'NSInvalidArgumentException', ragione: 'tipo sconosciuto NSComparisonPredicate dato a NSMetadataQuery (kMDItemFSName CONTIENE [c] "Alcuni String")'

+0

Possibile duplicato di questa domanda: http://stackoverflow.com/questions/8580715/nsarray-with-nspredicate-using-not-in – joern

+0

Puoi dirci ciò che il l'eccezione è? – Tommy

+0

joern, ho visto molte domande simili ma, come quella, non risponde al mio problema. "IN" non è lo stesso di contiene, in quanto riguarda set (come ho capito). @ Tommy, ho aggiornato la domanda. Spero che aiuti. – vargonian

risposta

10

ho avuto successo completo di:

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); 

I secondi due oggetti dei tre in testArray sono terminati in filteredArray, in OS X v10.7 e iOS v4.3. Quindi il problema non è il predicato - rendendo questa tecnicamente una risposta completa alla domanda - si tratta di una sorta di restrizione in NSMetadataQuery. Purtroppo non ho esperienza in quell'area, ma è certamente la prossima cosa da ricercare.

+0

Grazie, Tommy. Google produce solo un risultato apparentemente correlato alla loro limitazione con NSMetadataQuery, che presumibilmente è stata risolta usando "IN" invece di "CONTAINS", ma ciò sembra ovviamente sbagliato, dal momento che i documenti sono espliciti su CONTAINS essere per le stringhe e IN essere per dizionari, ecc. – vargonian

+0

Segnalo come una risposta poiché, sebbene non risolva il mio problema, la mia domanda era fuorviante. – 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)")