2014-11-13 7 views
6

Unten ist mein Code-SchnipselPrädikat Array von Strings in SWIFT filtern wirft Fehlermeldung, NSCFString ist nicht Schlüssel-Wert-Codierung

//Search Bar Delegate 
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) 
{ 
    println(searchText) 
    var predicate:NSPredicate=NSPredicate(format: "SELF CONTAINS[c] \(searchText)")! 
    self.listItemToBeDisplayed=listItem.filteredArrayUsingPredicate(predicate) 
    (self.view.viewWithTag(1) as UITableView).reloadData() 

} 

Fehler Ich habe:

*** App beenden aufgrund Uncaught-Ausnahme 'NSUnknownKeyException', Grund: '[< __NSCFString 0x17405ef90> valueForUndefinedKey:]: Diese Klasse ist für den Schlüssel V nicht schlüsselcodefähig.'

Ich möchte Strings in Array filtern, um durch meine Suchzeichenfolge gefiltert werden. Wenn meine Suchzeichenfolge in einer beliebigen Zeichenfolge im Array enthalten ist, sollte sie aufgelistet werden.

+0

Sorry, Code-Formatierung funktioniert nicht. – user1325792

+0

danke nhgrif für die Formatierung des Codes, wirklich zu schätzen wissen. Safari wird verrückt in diesen Tagen. – user1325792

+0

Ich glaube '' NSPredate (format:) 'erwartet stark, mit' printf'-artigen Formatstrings verwendet zu werden (es zitiert automatisch Argumente, wie es sie einfügt usw.). Sie verwenden die String-Interpolation von Swift - das könnte das Problem sein. – rickster

Antwort

13

NSPredicate(format:) wird stark davon ausgegangen, dass es mit PrintF-Style-Formatzeichenfolgen verwendet wird (es werden automatisch Argumente beim Einfügen zitiert, usw.).

Sie verwenden die String-Interpolation von Swift, sodass die bereits formatierte Abfrage als einzige Zeichenfolge an NSPredicate gesendet wird. Das verhindert, dass es Voodoo mit Argumenten macht, was zu einer fehlerhaften Abfrage führt.

Verwenden printf-Stil Formatierung statt:

if let predicate = NSPredicate(format: "SELF CONTAINS %@", searchText) { 
    self.listItemToBeDisplayed = (listItem as NSArray).filteredArrayUsingPredicate(predicate) 
    (self.view.viewWithTag(1) as UITableView).reloadData() 
} 
+0

filteredArrayUsingPredicate funktioniert nicht in Swift. –

+4

Sicher tut es - aber es wird von 'NSArray', nicht' Swift.Array' zur Verfügung gestellt, und seit Swift 1.2 müssen Sie manuell umwandeln, um 'NSArray' API zu verwenden. Aktualisierte Antwort, um das zu reflektieren. – rickster

0

mit Prädikat Arbeiten für ziemlich lange Zeit. Hier ist meine Schlussfolgerung (SWIFT)

//Customizable! (for me was just important if at least one) 
request.fetchLimit = 1 


//IF IS EQUAL 

//1 OBJECT 
request.predicate = NSPredicate(format: "name = %@", txtFieldName.text) 

//ARRAY 
request.predicate = NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname]) 


// IF CONTAINS 

//1 OBJECT 
request.predicate = NSPredicate(format: "name contains[c] %@", txtFieldName.text) 

//ARRAY 
request.predicate = NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])