Value Semantics
Mutating Copy
Mutating methods change the receiver variable, not every value copied from it.
Mutate one value
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)
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)"value ← 13
4mutating func advance(by step3: Int) {5 value→ 13 += step36}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
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)"value ← 11
4mutating func advance(by step1: Int) {5 value→ 11 += step16}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
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)"value ← 18
4mutating func advance(by step8: Int) {5 value→ 18 += step86}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.