【问题标题】:Reduce, manipulating the initial value减少,操纵初始值
【发布时间】:2015-05-21 08:18:49
【问题描述】:

我想使用另一个数组创建一个带有reduce() 的数组或字典。通常我会使用:

class Foo {
    var number: Int

    init(number: Int) {
        self.number = number
    }
}

let array1 = [Foo(number: 1), Foo(number: 1), Foo(number: 2)]
let array2: [Int] = array1.reduce([]) { $0 + [$1.number] }

println(array2)

[1, 1, 1]

但是如果我想操作初始值,我首先必须将它分配给一个新数组,操作它并返回该数组:

let array2: [Int: [Int]] = array1.reduce([:]) {
    var results = $0
    results[$1.number] = (results[$1.number] ?? []) + [$1.number]
    return results
}

println(array2)

[2: [2], 1: [1, 1]]

有没有办法避免必须创建一个新数组并返回它并直接使用初始值?

【问题讨论】:

  • 除了可读性问题之外,您还应该注意,像这样使用reduce,您编写的代码效率非常低,因为每次修改时都会复制整个数组/字典。优化器可能拯救你。您最好在第一种情况下使用 map,或者在第二种情况下使用 for 循环(可能包含在通用函数中)。
  • 是的,我同意。这些只是作为简单的例子。如果不是太复杂,我更喜欢reduce 而不是for-loop,因为我认为它看起来更好。

标签: arrays swift reduce


【解决方案1】:

您可以在 reduce() 闭包中使参数可变:

let array2: [Int: [Int]] = array1.reduce([:]) {

  (var results, i) in

  results[i.number] = (results[i.number] ?? []) + [i.number]

  return results
}

【讨论】:

  • 叹息.. 就是这么简单。我尝试了很多事情,忽略了如此简单的事情......谢谢:)
猜你喜欢
  • 2021-03-27
  • 2015-11-10
  • 2022-06-13
  • 1970-01-01
  • 2015-08-12
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多