Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 是否有方法对Swift阵列执行批更新?_Arrays_Swift - Fatal编程技术网

Arrays 是否有方法对Swift阵列执行批更新?

Arrays 是否有方法对Swift阵列执行批更新?,arrays,swift,Arrays,Swift,我有1000多个物品。最初,数组元素的状态称为initial 在某个时间点,我想将某些项目的状态更改为updated 如果我一个接一个地更改数组项,比如迭代数组并在满足条件的情况下更新它们的值,每次更新我都会得到数组的didSet的回调 我不要这个。我真正想要的是对数组执行批处理更新,因此,当我完成对数组中多个项的更新时,只会收到一次回调 在Swift中可以这样做吗?最简单的方法是制作一份副本,随意修改,然后重新分配。例如: var xs = [1,2,3,4] { didSet {

我有1000多个物品。最初,数组元素的状态称为
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]