参照渡しと値渡しとは〜Swift

〽️ 久々Swift。


参照渡しと値渡しについて考えてみましょう。codeはSwift。


まず値渡し。



太郎くんと次郎くんに、それぞれ番号を与えてあげます。

var Taro_number = 10
var Jiro_number = 10

それぞれ出力してみましょう。

print(Taro_number)
 ▶︎ 10

print(Jiro_number)
 ▶︎ 10

とっても普通ですよね。
次郎くんの番号を変更してみます。

Jiro_number = 11

出力すると当然結果はこうなります。

print(Taro_number)
 ▶︎ 10

print(Jiro_number)
 ▶︎ 11





次。参照渡し。



人物のデータを管理するためのクラス「Jinbutu」を定義して、その人物の番号を代入する変数numberを用意します。

class Jinbutu {
    var number:Int = 0
}


太郎くんのインスタンスを作ってあげましょう。番号も設定してあげます。

let Taro = Jinbutu()
Taro.number = 10

定数TaroにJinbutuクラスのインスタンスが代入されました。
番号を出力してみます。

print(Taro.number)
 ▶︎ 10



そして次郎くんに、太郎くんのインスタンスを代入すると・・

let Jiro = Taro




お・・・



この時!次郎くんのインスタンスが新たに生成されるわけではありません。
「次郎くん、あなたのデータについては太郎くんのインスタンスを参照してくださいね。」という感じで、参照先のルート(画像でいうところの矢印)のみが次郎くんに渡されています


定数Jiroに代入されたのはインスタンスそのものではなく、インスタンスTaroへの参照ルートです。これを「参照値」と言います。




どういう状態になっているのか。



現段階でのTaroとJiroの番号を出力してみましょう。

print(Taro.number)
 ▶︎ 10

print(Jiro.number)
 ▶︎ 10

Taroはインスタンスの実体なので、普通にTaroの変数numberの値を出力します。
JiroにはTaroへの参照値が入っているので、インスタンスTaroにアクセスし、変数numberの値を出力しています。

扨、Jiro.numberに「数値20」を代入してみます。

Jiro.number = 20
print(Jiro.number)
 ▶︎ 20



そうしたとき、Taro.numberはどうなっているのか。

print(Taro.number)
 ▶︎ 20



!!!

そう。Taro.numberも20になってしまっています。なんで?


・Taroにはインスタンスの実体が入っている

・Jiroには参照値(宛先はTaroインスタンス)が入っている

2つの定数に代入されている内容は違いますが、結果的にいずれもアクセス先は「Taroインスタンス」として共有されているのです。

したがってJiro.numberに数値を代入した時はこのようになります。


Jiro.number = 20

参照先であるTaroにアクセス


Taroの変数numberにアクセス


Taro.numberに20を代入

そう。JiroがインスタンスTaro、その中の変数にアクセスできてしまっているのです。

逆に、Taro.numberの値も変化させてみましょう。

//Taro.numberの値を変化させる
Taro.number = 30

//Jiro.numberの内容を見てみる
print(Jiro.number)
 ▶︎ 30

予想通りアクセス先が同じである、Jiro.numberも30となります。



 

まとめ。



Swiftで「値渡し」「参照渡し」について考えてみました。まとめてみます。

       値渡し       

◼︎ 数値や配列など、値そのものを渡すこと。

       参照渡し       

◼︎ 参照値を渡すことによって、アクセス先を共有させる。

いかがでしたか?理解の手助けとなれば幸いです 🎵







「ふ」です。

swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。

🐧 twitter 🐧