An inout parameter makes mutation explicit at the call site.

Pass a value for update

bonus
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)
  1. bonus ← 4, score ← 10

    5let bonus→ 4 = 4  //@bonus=0, 76var score→ 10 = 107addBonus(to: &score10, bonus: bonus4)8let message = "score=\(score)"
  2. score ← 14

    1func addBonus(to score10: inout Int, bonus4: Int) {2    score→ 14 += bonus43}
  3. score ← 14, message ← score=14

    6var score = 107addBonus(to: &score→ 14, bonus: bonus4)8let message→ score=14 = "score=\(score14)"910print(messagescore=14)
    outputscore=14
  1. bonus ← 0, score ← 10

    5let bonus→ 0 = 06var score→ 10 = 107addBonus(to: &score10, bonus: bonus0)8let message = "score=\(score)"
  2. func addBonus(to score: inout Int, bonus: Int)

    1func addBonus(to score10: inout Int, bonus0: Int) {2    score10 += bonus03}
  3. message ← score=10

    6var score = 107addBonus(to: &score10, bonus: bonus0)8let message→ score=10 = "score=\(score10)"910print(messagescore=10)
    outputscore=10
  1. bonus ← 7, score ← 10

    5let bonus→ 7 = 76var score→ 10 = 107addBonus(to: &score10, bonus: bonus7)8let message = "score=\(score)"
  2. score ← 17

    1func addBonus(to score10: inout Int, bonus7: Int) {2    score→ 17 += bonus73}
  3. 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.