我有一个包含 1000 多个项目的数组。最初,数组元素的状态称为 initial
。
在某个时间点,我想将某些项目的状态更改为已更新
。
如果我一个一个地更改数组项,例如遍历数组并在满足条件时更新它们的值,则每次更新时我都会收到数组的 didSet
的回调。
我不想要这个。我真正想要的是对数组执行批量更新,因此,当我完成对数组中多个项目的更新时,我只得到一次回调。
这在 Swift 中可能吗?
最佳答案
最简单的方法是制作一个副本,根据需要修改它,然后再分配回去。例如:
var xs = [1,2,3,4] {
didSet {
print("SET")
}
}
var ys = xs
ys[0] = 0
ys[2] = 100
xs = ys
(只打印一次“SET”。)
在你问之前:1000 项不是一个大数组。很少以这种方式复制它通常不是问题,除非存储的项目本身非常大。但是,如果复制真的成为一个问题怎么办?然后你可以走不安全的路线:
xs.withUnsafeMutableBufferPointer { (ptr) in
ptr[0] = 1000
ptr[1] = 2000
}
我有点打折 map
来解决这个问题,但在试图回应 Sulthan 的原因时,我有点说服自己放弃了。您绝对可以使用 map
,尤其是考虑到您提到的那种用例。
let updatedIndexes = [0, 2]
xs = xs.enumerated()
.map { (n, value) in
return updatedIndexes.contains(n) ? State.updated : value
}
关于arrays - 有没有办法对 Swift 数组执行批量更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50204303/