我在命令式中试图完成的事情:
var mapNames = [String]()
var mapLocation = [String]()
for valueMap in valueMaps {
if let name = valueMap.name {
mapNames.append(name)
}
if let location = valueMap.location {
mapLocation.append(location)
}
}
使用高阶函数或数组方法(array.filter
等)来压缩上面的代码并避免使用 for
循环的最佳方法是什么
这是我试过的,但是编译器给出了一个错误:
let getArrayOfNames = valueMaps.filter() {
if let name = ($0 as valueMaps).name as [String]! {
return name;
}
}
let getArrayOfLocations = valueMaps.filter() {
if let type = ($0 as valueMaps).location as [String]! {
return type;
}
}
最佳答案
你需要 filter()
和 map()
:
let mapNames = valueMaps.filter( {$0.name != nil }).map( { $0.name! })
let mapLocations = valueMaps.filter( {$0.location != nil }).map( { $0.location! })
过滤器将一个谓词作为参数(指定哪个 元素应包含在结果中), map 采用 转换 作为参数。你试图合并两者 方面进入过滤器,这是不可能的。
更新:从 Swift 2(?) 开始,序列有一个 flatMap()
方法,它
可用于一步获取结果:
let mapNames = valueMaps.flatMap { $0.name }
闭包应用于所有数组元素,返回值为一个 包含所有非零解包结果的数组。
关于Swift:避免命令式 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30336040/