Mutating methods change the receiver variable, not every value copied from it.

Mutate one value

step
mutating_copy.swift
Replay: real traced execution (multi-file project)
struct Counter {
    var value: Int

    mutating func advance(by step: Int) {
        value += step
    }
}

let step = 3
let original = Counter(value: 10)
var copy = original
copy.advance(by: step)
let message = "original=\(original.value), copy=\(copy.value)"

print(message)
struct Counter {
    var value: Int

    mutating func advance(by step: Int) {
        value += step
    }
}

let step = 1
let original = Counter(value: 10)
var copy = original
copy.advance(by: step)
let message = "original=\(original.value), copy=\(copy.value)"

print(message)
struct Counter {
    var value: Int

    mutating func advance(by step: Int) {
        value += step
    }
}

let step = 8
let original = Counter(value: 10)
var copy = original
copy.advance(by: step)
let message = "original=\(original.value), copy=\(copy.value)"

print(message)
  1. step ← 3, original ← Counter(value: 10), copy ← Counter(value: 10)

    9let step→ 3 = 3  //@step=1, 810let original→ Counter(value: 10) = Counter(value: 10)11var copy→ Counter(value: 10) = originalCounter(value: 10)12copyCounter(value: 10).advance(by: step3)13let message = "original=\(original.value), copy=\(copy.value)"
  2. value ← 13

    4mutating func advance(by step3: Int) {5    value→ 13 += step36}
  3. copy ← Counter(value: 13), message ← original=10, copy=13

    11var copy = original12copy→ Counter(value: 13).advance(by: step3)13let message→ original=10, copy=13 = "original=\(original.value10), copy=\(copy.value13)"1415print(messageoriginal=10, copy=13)
    outputoriginal=10, copy=13
  1. step ← 1, original ← Counter(value: 10), copy ← Counter(value: 10)

    9let step→ 1 = 110let original→ Counter(value: 10) = Counter(value: 10)11var copy→ Counter(value: 10) = originalCounter(value: 10)12copyCounter(value: 10).advance(by: step1)13let message = "original=\(original.value), copy=\(copy.value)"
  2. value ← 11

    4mutating func advance(by step1: Int) {5    value→ 11 += step16}
  3. copy ← Counter(value: 11), message ← original=10, copy=11

    11var copy = original12copy→ Counter(value: 11).advance(by: step1)13let message→ original=10, copy=11 = "original=\(original.value10), copy=\(copy.value11)"1415print(messageoriginal=10, copy=11)
    outputoriginal=10, copy=11
  1. step ← 8, original ← Counter(value: 10), copy ← Counter(value: 10)

    9let step→ 8 = 810let original→ Counter(value: 10) = Counter(value: 10)11var copy→ Counter(value: 10) = originalCounter(value: 10)12copyCounter(value: 10).advance(by: step8)13let message = "original=\(original.value), copy=\(copy.value)"
  2. value ← 18

    4mutating func advance(by step8: Int) {5    value→ 18 += step86}
  3. copy ← Counter(value: 18), message ← original=10, copy=18

    11var copy = original12copy→ Counter(value: 18).advance(by: step8)13let message→ original=10, copy=18 = "original=\(original.value10), copy=\(copy.value18)"1415print(messageoriginal=10, copy=18)
    outputoriginal=10, copy=18
mutating copy When a struct value is copied, a mutating method on the copy leaves the original value alone.