2015-06-30 43 views
12

dire che ho avuto l'API di seguito:Mappa con opzionale Scartare a Swift

func paths() -> [String?] { 
    return ["test", nil, "Two"] 
} 

E stavo usando questo in un metodo in cui avevo bisogno [String], quindi ho dovuto scartare utilizzando la semplice funzione map. Attualmente sto facendo:

func cleanPaths() -> [String] { 
    return paths.map({$0 as! String}) 
} 

Qui, il cast forzato causerà un errore. Quindi, tecnicamente, ho bisogno di scartare le stringhe nell'array paths. Sto avendo qualche problema a fare questo e sembra stia ottenendo errori stupidi. Qualcuno può aiutarmi qui?

risposta

33

flatMap() può fare questo per voi in un unico passaggio:

let paths:[String?] = ["test", nil, "Two"] 

let nonOptionals = paths.flatMap{$0} 

nonOptionals sarà ora un array di stringhe contenente ["test", "Two"] .

+0

Complimenti per scavare questa funzione dalla trincea delle funzioni di ordine superiore non documentati di Swift ! –

+1

@ZoffDino - Il merito dovrebbe essere di Airspeed Velocity: http://airspeedvelocity.net/2015/06/23/protocol-extensions-and-the-death-of-the-pipe-forward-operator/ che per primo ha puntato questo per me. –

+0

Ho giocato con Swift per 9 mesi e ancora non sono riuscito a trovare un elenco completo delle funzioni di ordine superiore nella lingua. Apple ha molto da recuperare su questo fronte. –

1

Forse ciò che si desidera è un filter seguito da un map:

func cleanPaths() -> [String] { 
    return paths() 
      .filter {$0 != nil} 
      .map {$0 as String!} 
} 

let x = cleanPaths() 
println(x) // ["test", "two"] 
4

Si dovrebbe filtrare prima, e seguente mappa:

return paths.filter { $0 != .None }.map { $0 as! String } 

ma utilizzando flatMap come suggerito da @BradLarson è una giusta migliore

Problemi correlati