我有1000多个项目的数组。最初,数组元素的状态称为initial
。
在某些时候,我想将某些项目的状态更改为updated
。
如果我逐个更改数组项,比如遍历数组并在满足条件时更新它们的值,每次更新时我都会得到数组didSet
的回调。
我不想要这个。我真正想要的是对数组执行批量更新,因此,当我完成更新数组中的多个项目时,我只获得一次回调。
Swift可以吗?
答案 0 :(得分:3)
最简单的方法是制作副本,根据需要进行修改,然后再分配。例如:
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
}
答案 1 :(得分:0)
批量更新数组的另一种方法是将其作为inout
变量传递给更新它的函数。由于inout
的 copy in-copy out 语义,数组只会更新一次:
class Foo {
var arr: [Int] = [1,2,3,4,5] {
didSet {
print("SET")
}
}
func batchUpdate(_ arr: inout [Int]) {
for idx in arr.indices {
arr[idx] *= 2
}
}
func test() {
batchUpdate(&arr)
print(arr)
}
}
Foo().test()
SET [2, 4, 6, 8, 10]