【Swift/SwiftUI】関数のinout引数で変数の参照を渡す方法

本記事ではSwiftにおいてinout引数を使用して、関数に引数として実際に渡される変数の値を操作する方法について簡単に解説していきます。

inout引数とは

まず一般的な関数では、関数の呼び出し元から引数を渡してその引数を元に演算を行い、演算結果を呼び出し元に返却するという動きをします。

この際、変数の関数内で引数で貰った値を変更することもできますが、関数内の引数を変更しても呼び出し元の引数の値を変更することはできません。

なぜなら関数の呼び出しで引数を渡す場合には、呼び出し元の引数の値がコピーされて関数に渡るためです。

しかし実際には呼び出し元の値を変更したい場合もありますよね。そんな時に使用できるのがinout引数です。

inout引数を使用することで、呼び出し元から関数に対して引数の参照が渡されます。参照が渡されることにより値のコピーではなく、実際の変数の値を変更することができます。

この2つの変数の渡し方を一般的には、値渡しと参照渡しという言い方で表現され、多くのプログラミング言語で共通して使用される概念になります。

inout引数の作成

一般的な関数の定義では「引数名: 引数のデータ型」という形で引数を定義しますが、inout引数を持つ関数の宣言方法は以下の通りで、「引数名: inout 引数のデータ型」という形で定義します。

処理の内容としては、引数でもらったpointに10を加算しているだけですが、この処理で実際にpointに渡されている呼び出しもとの変数のデータが変更されます。

func addDefaultNumber(point: inout Int ) -> Void {
    point += 10
}

関数の呼び出しを行う際には、inout引数に渡したい変数に「&」をつけて参照渡しであることを明示します。

var beforePoint = 1
addDefaultNumber(point: &beforePoint)

printなどで、beforePoint変数の関数実行前後の値を確認してみましょう。

関数実行後にbeforePointの値が1から11に変更されていることが確認できました。

var beforePoint = 1
print(beforePoint)   //出力結果 1

func addDefaultNumber(point: inout Int ) -> Void {
    point += 10
}

addDefaultNumber(point: &beforePoint)

print(beforePoint)   //出力結果 11

inout引数の利用

inout引数は配列の要素に対しても使用することができ、呼び出し元からは配列をそのまま渡すことができます。

配列をそのまま渡した後に、関数内で配列の要素のそれぞれの値の参照を見て変更を行うことができます。

配列全てを参照するにはfor eachなどを使用することが一般的ですが、今回はわかりやすいように各要素に直接アクセスして確認します。

var numArray = [1,2,3]

print(numArray)

func addNumberArray(nums: inout Array<Int> ) -> Void {
    nums[0] += 10
    nums[1] += 10
    nums[2] += 10
}

addNumberArray(nums: &numArray)

print(numArray)

最後に

本記事では、inout を使用して関数内で引数の参照を渡す方法をご紹介しました。

  • 引数の参照を渡すには関数宣言の引数にinout をつける
  • 呼び出し元から関数に渡す引数の前に「&」をつける

他にもSwiftやSwiftUIでのリストの作成方法や関数の宣言方法についても解説していますのでぜひご確認お願いします。