Value Semantics
Inout Update
An inout parameter makes mutation explicit at the call site.
Pass a value for update
inout_update.swift
Replay: real traced execution (multi-file project)
func addBonus(to score: inout Int, bonus: Int) {
score += bonus
}
let bonus = 4
var score = 10
addBonus(to: &score, bonus: bonus)
let message = "score=\(score)"
print(message)
func addBonus(to score: inout Int, bonus: Int) {
score += bonus
}
let bonus = 0
var score = 10
addBonus(to: &score, bonus: bonus)
let message = "score=\(score)"
print(message)
func addBonus(to score: inout Int, bonus: Int) {
score += bonus
}
let bonus = 7
var score = 10
addBonus(to: &score, bonus: bonus)
let message = "score=\(score)"
print(message)
bonus ← 4, score ← 10
5let bonus→ 4 = 4 //@bonus=0, 76var score→ 10 = 107addBonus(to: &score10, bonus: bonus4)8let message = "score=\(score)"score ← 14
1func addBonus(to score10: inout Int, bonus4: Int) {2 score→ 14 += bonus43}score ← 14, message ← score=14
6var score = 107addBonus(to: &score→ 14, bonus: bonus4)8let message→ score=14 = "score=\(score14)"910print(messagescore=14)outputscore=14
bonus ← 0, score ← 10
5let bonus→ 0 = 06var score→ 10 = 107addBonus(to: &score10, bonus: bonus0)8let message = "score=\(score)"func addBonus(to score: inout Int, bonus: Int)
1func addBonus(to score10: inout Int, bonus0: Int) {2 score10 += bonus03}message ← score=10
6var score = 107addBonus(to: &score10, bonus: bonus0)8let message→ score=10 = "score=\(score10)"910print(messagescore=10)outputscore=10
bonus ← 7, score ← 10
5let bonus→ 7 = 76var score→ 10 = 107addBonus(to: &score10, bonus: bonus7)8let message = "score=\(score)"score ← 17
1func addBonus(to score10: inout Int, bonus7: Int) {2 score→ 17 += bonus73}score ← 17, message ← score=17
6var score = 107addBonus(to: &score→ 17, bonus: bonus7)8let message→ score=17 = "score=\(score17)"910print(messagescore=17)outputscore=17
inout
The `&` marker shows where a function is allowed to update the caller's variable.