说我有以下api:
func paths() -> [String?] {
return ["test", nil, "Two"]
}
我在一个需要[String]
的方法中使用它,因此我不得不使用简单的map
函数来解开它。我现在正在做的事情:
func cleanPaths() -> [String] {
return paths.map({$0 as! String})
}
这里,强制转换会导致错误。所以从技术上讲,我需要在paths
数组中打开字符串。我在做这件事时遇到了一些麻烦,而且似乎有些愚蠢的错误。有人可以帮助我吗?
答案 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)}