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

Скажем, у меня был ниже API:

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

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

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

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

4 ответа

Решение

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

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

let nonOptionals = paths.compactMap{$0}

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

предварительно flatMap() было правильным решением, но в Swift 4.1 для этой цели устарело

Сначала вы должны отфильтровать, а затем карту:

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

но используя flatMap как предложено @BradLarson просто лучше

Возможно, вы хотите это filter с последующим map:

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

let x = cleanPaths()
println(x) // ["test", "two"]
let name = obj.value
name.map { name  in print(name)}
Другие вопросы по тегам