有没有办法在Swift阵列上执行批量更新?

时间:2018-05-06 20:37:04

标签: arrays swift

我有1000多个项目的数组。最初,数组元素的状态称为initial

在某些时候,我想将某些项目的状态更改为updated

如果我逐个更改数组项,比如遍历数组并在满足条件时更新它们的值,每次更新时我都会得到数组didSet的回调。

我不想要这个。我真正想要的是对数组执行批量更新,因此,当我完成更新数组中的多个项目时,我只获得一次回调。

Swift可以吗?

2 个答案:

答案 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]