Swift:避免使用For Loop

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)

Mar*_*n R 5

你需要两个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)

闭包应用于所有数组元素,返回值是一个包含所有非零未包装结果的数组.