2014-11-13 11 views
6

Qui di seguito è il mio frammento di codicepredicato per filtrare array di stringhe in SWIFT getta errore dicendo NSCFString non è valore-chiave di codifica

//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() 

} 

errore ho ottenuto:

*** Chiusura di applicazione a causa di eccezione non rilevata 'NSUnknownKeyException', motivo: '[< __NSCFString 0x17405ef90> valueForUndefinedKey:]: questa classe non è un codice di codifica conforme alla chiave V.

Voglio filtrare le stringhe nella matrice per essere filtrato dalla mia stringa di ricerca. Se la mia stringa di ricerca è contenuta in una qualsiasi delle stringhe dell'array, dovrebbe essere elencata.

+0

scusa, la formattazione del codice non funziona. – user1325792

+0

grazie a nhgrif per la formattazione del codice, lo apprezzo davvero. safari impazzire in questi giorni. – user1325792

+0

Credo che 'NSPredicate (format:)' si aspetta fortemente di essere usato con le stringhe di formato 'printf' (cita automaticamente gli argomenti mentre li inserisce, ecc.). Stai usando l'interpolazione a stringa di Swift, che potrebbe essere il problema. – rickster

risposta

13

NSPredicate(format:) si aspetta fortemente che venga utilizzato con stringhe di formato in stile printf (esso cita automaticamente gli argomenti mentre li inserisce, ecc.).

Si sta usando l'interpolazione stringa di Swift, quindi la query già formattata arriva a NSPredicate come una singola stringa. Ciò impedisce di fare qualsiasi cosa voodoo faccia con gli argomenti, lasciandoti con una query malformata.

utilizzare la formattazione in stile printf invece:

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

filteredArrayUsingPredicate non funziona in Swift. –

+4

Certo che lo fa - ma è fornito da 'NSArray', non' Swift.Array', e dal momento che Swift 1.2 devi lanciare manualmente per usare l'API 'NSArray'. Risposta aggiornata per riflettere questo. – rickster

0

Lavorare con predicato per tempo piuttosto lungo. Ecco la mia conclusione (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])