使用Swift中的可选解包映射

时间:2015-06-30 21:15:22

标签: swift dictionary optional unwrap

说我有以下api:

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

我在一个需要[String]的方法中使用它,因此我不得不使用简单的map函数来解开它。我现在正在做的事情:

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

这里,强制转换会导致错误。所以从技术上讲,我需要在paths数组中打开字符串。我在做这件事时遇到了一些麻烦,而且似乎有些愚蠢的错误。有人可以帮助我吗?

4 个答案:

答案 0 :(得分:37)

compactMap()可以一步为您完成此操作:

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

let nonOptionals = paths.compactMap{$0}

nonOptionals现在是一个包含["test", "Two"]的字符串数组。

以前flatMap()是正确的解决方案,但在Swift 4.1中已为此目的而弃用

答案 1 :(得分:4)

您应首先过滤,然后映射下一个:

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

但是@BradLarson建议使用flatMap是一个更好的

答案 2 :(得分:1)

也许您想要的是filter后跟map

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

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

答案 3 :(得分:0)

let name = obj.value
name.map { name  in print(name)}