2015-04-04 16 views
8

che ho avuto problemi di filtraggio serie di parole chiave (stringhe) in rapida, Il mio codice:Swift serie del filtro di stringhe

self.filteredKeywords=filter(keywords.allValues, {(keyword:NSString) ->            
    Bool in 
    let words=keyword as? NSString 
    return words?.containsString(searchText) 
    }) 

Come AnyObject non può essere sottotipo di NSString, mi sono bloccato con questo!

+0

Qual è l'errore esatto che si ottiene? Cosa viene stampato se si prova 'NSLog (" \ (keywords) ")'? – Undo

+0

Basta notare che si sta restituendo un optional. Spero che questo aiuti –

+0

non eseguito mi dà l'errore di cui sopra: "AnyObject non è un sottotipo di NSString" – Meseery

risposta

16

[Aggiornamento per Swift 2.0]

Come NSString è colmato a Swift String numero verde, basta evitare le coercizioni con:

3> ["abc", "bcd", "xyz"].filter() { nil != $0.rangeOfString("bc") } 
$R1: [String] = 2 values { 
    [0] = "abc" 
    [1] = "bcd" 
} 

Ma, se si pensa allValues non sono stringhe:

(keywords.allValues as? [String]).filter() { nil != $0.rangeOfString("bc") } 

che restituisce una matrice opzionale.

4

Il tuo filter è oltre [AnyObject], ma la tua chiusura richiede NSString. Questi devono corrispondere. Inoltre, il risultato deve essere un Bool, non uno Bool?. È possibile affrontare questi semplicemente in questo modo:

self.filteredKeywords = filter(keywords.allValues, { 
    let keyword = $0 as? NSString 
    return keyword?.containsString(searchText) ?? false 
}) 

Questo accetta AnyObject e poi cerca di costringere il basso per NSString. Quindi, nil-coalleces (??) il risultato per assicurarsi che sia sempre un Bool.

Si consiglia, tuttavia, di trattare keywords come [String:String] anziché NSDictionary. Ciò eliminerebbe tutte le complicazioni di AnyObject. Quindi è sufficiente fare questo:

self.filteredKeywords = keywords.values.filter { $0.rangeOfString(searchText) != nil } 

Se possibile, convertire le raccolte di base in raccolte Swift non appena è possibile e memorizzarle. Se si dispone di oggetti Foundation in arrivo, si può generalmente convertirli facilmente con tecniche come:

let dict = nsdict as? [String:String] ?? [:] 

Oppure si può fare quanto segue per convertirli in modo tale che faranno accelerato di debug (ma in silenzio "lavoro" in stampa) :

0

C'è un problema con la risposta di GoZoner per determinati tipi di dati e anche un modo leggermente migliore per farlo. I seguenti esempi possono mostrare questo:

let animalArray: NSMutableArray = ["Dog","Cat","Otter","Deer","Rabbit"] 
let filteredAnimals = animalArray.filter { $0.rangeOfString("er") != nil } 
print("filteredAnimals:", filteredAnimals) 

filteredAnimals: [Dog, Cat, Otter, Deer, Rabbit] 

Probabilmente non il set che ci si aspettava!

Tuttavia, questo funziona bene in questo modo se non si digita animalArray come NSMutableArray:

let animalArray = ["Dog","Cat","Otter","Deer","Rabbit"] 
let filteredAnimals = animalArray.filter { $0.rangeOfString("er") != nil } 
print("filteredAnimals:", filteredAnimals) 

filteredAnimals: [Otter, Deer] 

Tuttavia mi consiglia di utilizzare $ 0.contains() invece di $ 0.rangeOfString()! = nil perché funziona in entrambe le circostanze, e un po 'migliora la leggibilità del codice:

let animalArray: NSMutableArray = ["Dog","Cat","Otter","Deer","Rabbit"] 
let filteredAnimals = animalArray.filter { $0.contains("er") } 
print("filteredAnimals:", filteredAnimals) 

filteredAnimals: [Otter, Deer] 
Problemi correlati