Swift:避免命令式 For 循环

标签 swift ios8 functional-programming

我在命令式中试图完成的事情:

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/

相关文章:

swift - 为什么这些 getter/setter 中的 1 个起作用而其他的不起作用

ios - Swift 使用 GPUImage 发送压缩视频帧

java - 如何跳过java流中的连续元素?

swift - 何时不使用 eraseToAnyPublisher()

ios - 将自定义类对象转换为 NSData

xcode - 使用swift在NSUserDefaults ios8中设置默认值

ios - self.presentingViewController 在 iOS 8 上损坏?

ios - 取消按钮在 MFMailComposeViewController 中不执行任何操作 - iOS 8

javascript - 使用 [...new Set()] 仅获取基于内部 Array<object.id> 的唯一值?

scala - 为什么 future 会有副作用?