use*_*173 1 functional-programming swift ios8
我正在努力完成的任务:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
使用高阶函数或数组方法(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;
}
}
Run Code Online (Sandbox Code Playgroud)
你需要两个filter()和map():
let mapNames = valueMaps.filter( {$0.name != nil }).map( { $0.name! })
let mapLocations = valueMaps.filter( {$0.location != nil }).map( { $0.location! })
Run Code Online (Sandbox Code Playgroud)
过滤器将谓词作为参数(指定应在结果中包含哪些元素),并且映射将变换作为参数.您试图将两个方面合并到过滤器中,这是不可能的.
更新:从Swift 2(?)开始,有一个flatMap()序列方法,可用于在一个步骤中获得结果:
let mapNames = valueMaps.flatMap { $0.name }
Run Code Online (Sandbox Code Playgroud)
闭包应用于所有数组元素,返回值是一个包含所有非零未包装结果的数组.
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |