関数内での引数への再代入を関数外へ反映させたいとき、インアウト引数を使用します。
var userName = ""
func getUserName(user: inout String) {
if user.isEmpty {
user = "Watanabe"
}
print(user)
}
getUserName(user: &userName)
インアウト引数を使用するには、引数の型の前にinoutキーワードを追加します。
インアウト引数を持つ関数を呼び出す時は、引数の先頭に&をつけます。
ちなみに、普通にinoutをつけずに書いてみると、
var userName = ""
func getUserName(user: String) {
if user.isEmpty {
user = "Watanabe"
}
print(user)
}
getUserName(user: &userName)
関数内の条件分岐の中で下記のエラーが出てきます。
Cannot assign to value: 'user' is a 'let' constant
関数内でuserを新たに定義しなければいけないと怒られました。
なぜか?
二番目のプログラムで行っているのは値渡しですが、最初に書いたinout引数を使用したプログラムは参照渡しを行っています。
参照渡しとは、変数のアドレスを引き渡すことです。
参照渡しは値ではなくアドレスを渡すので、変数そのものの値が書き換えられ、さらに元の値も失われます。よって値を変更することに成功しました。
参考
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
https://qiita.com/Hic2770/items/9214487fe031846c286d