Arrays 是否有方法对Swift阵列执行批更新?
我有1000多个物品。最初,数组元素的状态称为Arrays 是否有方法对Swift阵列执行批更新?,arrays,swift,Arrays,Swift,我有1000多个物品。最初,数组元素的状态称为initial 在某个时间点,我想将某些项目的状态更改为updated 如果我一个接一个地更改数组项,比如迭代数组并在满足条件的情况下更新它们的值,每次更新我都会得到数组的didSet的回调 我不要这个。我真正想要的是对数组执行批处理更新,因此,当我完成对数组中多个项的更新时,只会收到一次回调 在Swift中可以这样做吗?最简单的方法是制作一份副本,随意修改,然后重新分配。例如: var xs = [1,2,3,4] { didSet {
initial
在某个时间点,我想将某些项目的状态更改为updated
如果我一个接一个地更改数组项,比如迭代数组并在满足条件的情况下更新它们的值,每次更新我都会得到数组的didSet
的回调
我不要这个。我真正想要的是对数组执行批处理更新,因此,当我完成对数组中多个项的更新时,只会收到一次回调
在Swift中可以这样做吗?最简单的方法是制作一份副本,随意修改,然后重新分配。例如:
var xs = [1,2,3,4] {
didSet {
print("SET")
}
}
var ys = xs
ys[0] = 0
ys[2] = 100
xs = ys
(只打印一次“设置”。)
在您提问之前: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
}
批量更新数组的另一种方法是将其作为
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()
更新您的问题,显示相关代码,演示您需要解决的问题。
Array.map
通常是解决方案。@Sulthan我有点打折map
,因为有时这类问题会变得复杂,如果更改的数量很小,感觉需要大量处理,但尝试一下,同意,这是一个很好的方法。哈,这很好,我使用了复制的方式,1000不是复制的问题,我的意思是在1000元素中的每个更新不需要回调。谢谢Rob,很高兴见到你在StftExcel,喜欢你的谈话:)老实说,我也会考虑制作<代码>更新<代码>一个单独的变量,例如“代码> var更新:设置< /Cord>”,但这完全取决于确切的用例。
SET
[2, 4, 6, 8, 10]