⚡
【Swift】参照渡しを行う方法・inout 引数
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パラメータを作るのは、基本的には避けた方がよいでしょう。意図しないところで値の書き換えが起こるというのが、バグの元になります。関数から新しいデータを返してもらったほうが、プログラムのロジックを追うのが簡単になるので、通常はそのほうがよいはずです。
メリットとしては、参照を使用することでメモリコピーによるオーバーヘッドを避けることができます。
参考
Discussion
リテラルは 渡す変数を持っていないからでは……?(※参照渡しは 変数自体を渡す機能な為)