関数の本体の中では、仮引数は変数ではなく定数として扱われます。仮引数の値を変更しようとすると、コンパイル時にエラーになります。 関数で仮引数の値を変更したい場合は、in-outパラメータを使い、値が変更されうることを明示する必要があります。
in-outパラメータを使うには、次の3つのポイントを押さえる必要があります。
:と型名の間にキーワードinoutを書き、in-outパラメータであることを明示する必要があります。&を付けて、変更可能であることを明示する必要があります。これらを満たすと、関数はin-outパラメータのコピーを内部で作り、関数本体の指示に従ってそれを変更し、関数が戻るときに変更後の値を、渡された変数へ書き戻します。
func updateVersion(_ record: inout (version: Int, title: String)) {
record.version += 1
}
var dbRecord = (version: 2, title: "Exercism")
updateVersion(&dbRecord)
// dbRecord is now (3, "Exercism")
in-outパラメータについては、ほかにも知っておきたいルールが2つあります。
1. in-outパラメータを持つ関数の内部では、in-outパラメータとして渡された変数を参照することはできません。
2. 同じ変数を、同じ関数の複数のin-outパラメータとして渡すことはできません。
たとえば、`inoutFunc(&mutVar, &mutVar)`はコンパイルエラーになります。