Swift 函数式编程 - 有没有比两个 map 调用更好的方法来翻译嵌套 for 循环

Swift Functional Programming - is there a better way to translate a nested for loop than two map calls

我已将嵌套 for 循环转换为嵌套 map 调用。我想知道是否有更优雅的实现方式。

这里是一个函数,它接受一个 ArrayItem 和一个 Array 的函数 (Item -> Item) 和 returns 一个数组应用于每个项目的所有功能:

typealias Item = Dictionary<String, String>    

func updatedItems(items: Array<Item>, fns: Array<Item -> Item>) -> Array<Item> {
    return items.map {
        item in

        var itemCopy = item
        fns.map { fn in itemCopy = fn(itemCopy) }

        return itemCopy
    }
}

内部 map() 调用不会 return 一个新数组,它只是为了产生副作用。这行得通,但有时 "frowned-upon" (请参阅 例如 ).

将所有函数依次应用到单个项目的"proper"方法是 使用 reduce:

func updatedItems(items: Array<Item>, fns: Array<Item -> Item>) -> Array<Item> {
    return items.map {
        item in
        fns.reduce(item) {
            (curItem, fn) in
            fn(curItem)
        }
    }
}

或使用 shorthand 参数名称:

func updatedItems(items: Array<Item>, fns: Array<Item -> Item>) -> Array<Item> {
    return items.map {
        fns.reduce([=11=]) { ([=11=]) }
    }
}

另请注意,您可以将数组符号缩短为

func updatedItems(items: [Item], fns: [Item -> Item]) -> [Item] { ... }

另一个解决方案是使用 enumerate 以便也可以访问索引。

return items.enumerate().map { (idx, item) in
   let fn = fns[idx] as <Item -> Item>
   return fn(item)
}