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 回答
1

也许您想要的是 afilter后跟 a map

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

let x = cleanPaths()
println(x) // ["test", "two"]
于 2015-06-30T21:23:00.603 回答
-1
let name = obj.value
name.map { name  in print(name)}
于 2018-08-30T19:24:53.633 回答