Карта с дополнительной распаковкой в ​​Swift

Скажем, у меня было следующее api:

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

И я использовал это в методе, где мне нужно [String], поэтому мне пришлось разворачивать его с помощью простой функции map. Я сейчас делаю:

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

Здесь принудительное приведение приведет к ошибке. Поэтому технически мне нужно развернуть строки в массиве paths. У меня возникли проблемы с этим и, похоже, возникают глупые ошибки. Может кто-нибудь помочь мне здесь?

Ответ 1

flatMap() может сделать это за один шаг:

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

let nonOptionals = paths.flatMap{$0}

nonOptionals теперь будет массивом String, содержащим ["test", "Two"].

Ответ 2

Сначала вы должны отфильтровать и отобразить следующее:

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

но использование flatMap, как было предложено @BradLarson, - это просто лучше

Ответ 3

Возможно, вам нужно filter, за которым следует map:

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

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