Swiftのinout引数の使い方と注意点を徹底解説!初心者でも理解できる変数の書き換え方法
生徒
「Swiftで関数の中で変数の値を変更したいときって、どうすればいいんですか?」
先生
「その場合はinout引数を使うと便利ですよ。関数の外の変数を直接変更できます。」
生徒
「関数って普通、中の処理だけで完結するものじゃないんですか?」
先生
「確かにそうですが、inoutを使うと、関数の外にある変数を“直接”書き換えることができるんです。詳しく説明していきましょう!」
1. Swiftのinout引数とは?
inout引数とは、関数の引数として渡した変数の「元の値」を関数の中で変更するための仕組みです。通常の関数は、変数のコピーを受け取って処理するため、関数の外の変数には影響を与えません。
ですが、inoutを使うと、関数の中で値を変えた結果が、関数の外に反映されるようになります。まるで「箱ごと」渡して中身を書き換えるようなイメージです。
2. inout引数の書き方と使い方
inout引数は、関数の引数の前にinoutキーワードをつけて定義します。そして、関数を呼び出すときには、引数に&(アンパサンド)をつけて渡します。
func addTen(to number: inout Int) {
number += 10
}
var myNumber = 5
addTen(to: &myNumber)
print(myNumber)
15
この例では、変数myNumberを関数addTenに渡して、値を直接書き換えています。関数の外でもmyNumberが15に更新されていますね。
3. inoutを使うメリット
inout引数を使うことで、複数の値を関数の中で更新したいときに、戻り値を増やさずに簡潔に書けます。
たとえば、2つの変数の値を入れ替える関数もinoutで実現できます。
func swapValues(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swapValues(&x, &y)
print("x: \(x), y: \(y)")
x: 20, y: 10
このように、inoutを使えばスッキリしたコードで変数を入れ替えられます。
4. inoutを使うときの注意点
inout引数にはいくつか注意が必要です。正しく使わないと、予期しない動作やエラーの原因になります。
- 定数(let)は渡せない:変更が前提なので、定数は使えません
- 同じ変数を複数のinoutに同時に渡せない:競合してバグの原因になります
- 関数の戻り値ではなく、引数側で値が変わる:呼び出し方に注意しましょう
例えば、以下のようなコードはエラーになります:
let a = 5
addTen(to: &a) // エラー!定数を渡している
inoutではvar(変更可能な変数)を使う必要があります。
5. inoutを使う場面とは?
inout引数は以下のような場面で役立ちます:
- 複数の値を一括で変更したいとき
- 複雑なデータ構造を直接変更したいとき
- パフォーマンスを考えて値のコピーを避けたいとき
ただし、初心者のうちはinoutを多用するよりも、戻り値で結果を返す方法の方が分かりやすいこともあります。使いどころを見極めて使いましょう。
6. inoutを使わない方法との比較
inoutを使わない場合は、関数の戻り値を使って値を返します。たとえば、次のように書き換えることができます。
func addTenReturn(_ number: Int) -> Int {
return number + 10
}
var myNumber = 5
myNumber = addTenReturn(myNumber)
print(myNumber)
15
このように、inoutを使わずに「新しい値として返す」方法も安全でわかりやすいので、初心者にはおすすめです。