Самый простой способ сделать это - сделать копию, изменить ее так, как вам нравится, и затем вернуть ее обратно. Например:
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
, чтобы решить это, но, пытаясь ответить Султану о том, почему, я как бы отговорил себя от этого. Вы можете определенно использовать map
, особенно учитывая тот тип использования, о котором вы упоминали.
let updatedIndexes = [0, 2]
xs = xs.enumerated()
.map { (n, value) in
return updatedIndexes.contains(n) ? State.updated : value
}