【Swift】参照渡しを行う方法・inout 引数

2022/06/14に公開

inout キーワードを引数に設定することで、いわゆる「参照渡し」を実装できます。

つまり、関数の中でその引数に変更を加えた場合、呼び出し側の元の変数にも変更が適用されることになります。

方法

関数宣言時、引数に inoutキーワードを設定します。

public func main(type: inout UInt8) -> Int16 {
        return result
}

呼出

この inoutの引数として値を渡す場合は、いくつかの注意点があります。

mutableな参照を渡す

  • 参照を渡す場合は、&を付与します。
  • letで宣言された場合は、エラーになります。
public func main(type: inout UInt8) -> Int16 {
        return result
}

var type = 1
let result = main(type: &type)

変数宣言が必要

引数に直接データを渡すと、その引数は imutableになります。したがってコンパイルエラーになります。

public func main(type: inout UInt8) -> Int16 {
        return result
}

// var type = 1
let result = main(type: 1) // Error!

使い所は?

inoutパラメータを作るのは、基本的には避けた方がよいでしょう。意図しないところで値の書き換えが起こるというのが、バグの元になります。関数から新しいデータを返してもらったほうが、プログラムのロジックを追うのが簡単になるので、通常はそのほうがよいはずです。

メリットとしては、参照を使用することでメモリコピーによるオーバーヘッドを避けることができます。

参考

https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID545

https://stackoverflow.com/questions/34486052/when-to-use-inout-parameters

Discussion