Ian Warburton Ian Warburton - 4 months ago 8
Swift Question

How to copy a struct and modify one of its properties at the same time?

If I want to represent my view controller's state as a single struct and then implement an undo mechanism, how would I change, say, one property on the struct and, at the same time, get a copy of the the previous state?

struct A {
let a: Int
let b: Int

init(a: Int = 2, b: Int = 3) {
self.a = a
self.b = b
}
}

let state = A()


Now I want a copy of
state
but with b = 4. How can I do this without constructing a new object and having to specify a value for every property?

Answer

Note, that while you use placeholder values for constants a and b you are not able to construct instance of A with any other values but this placeholders. Write initializer instead. You may write custom method that change any value in struct also:

struct A {
    let a: Int
    let b: Int

    init(a: Int = 2, b: Int = 3) {
        self.a = a
        self.b = b
    }

    func changeValues(a: Int? = nil, b: Int? = nil) -> A {
        return A(a: a ?? self.a, b: b ?? self.b)
    }
}

let state = A()
let state2 = state.changeValues(b: 4)