18

以下のAPIがあるとします:

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

そして、必要なメソッドでこれを[String]使用していたため、単純なmap関数を使用してラップを解除する必要がありました。私は現在やっています:

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

ここで、強制キャストはエラーになります。技術的には、配列内の文字列をアンラップする必要がありpathsます。これを行うのに問題があり、ばかげたエラーが発生しているようです。誰かがここで私を助けてくれますか?

4

4 に答える 4

46

compactMap()ワンステップでこれを行うことができます:

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

let nonOptionals = paths.compactMap{$0}

nonOptionalsを含む文字列配列になります["test", "Two"]

以前flatMap()は適切な解決策でしたが、Swift 4.1 でこの目的のために非推奨になりました

于 2015-06-30T21:24:09.813 に答える
5

最初にフィルタリングし、次にマップする必要があります。

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

flatMapしかし、@BradLarsonによって提案されたように使用することは、より良いです

于 2015-06-30T21:24:14.293 に答える