見出し画像

Swiftでいこう! - 値型と参照型

Swiftでは、データを表すためにクラス、構造体、列挙型と3つの型の種類があります。これらの違いの一つで、値の受渡し方法があります。構造体と列挙型は 値型 で、クラスが 参照型 になります。

値型

値型とは、変数の値が参照ではなく直接、値をもつ型のことをいいます。変数や定数に値が代入されたときや関数に渡されたときに、新たに値がコピーされてメモリ領域を確保します。複数のインスタンスで値を共有することはなく、一度代入された値は再代入をしない限りは不変です。そのため、値の変更が予測しやすいようになっています。

単純に変数に値を入れる場合は値型となってそれぞれの変数にそれぞれの値が入って行きます。変数相互に影響はありません。

var a = 5
var b = a  // bにaの値を代入

// インスタンスは共有されないため、aの値を変更してもbの値は変わらない。
a = a * 2
print(a)  // 10
print(b)  // 5


参照型

参照型は値の受け渡しをした変数や定数と変更を共有する

class MyType {
    var int: Int
    init(int: Int) {
        self.int = int
    }
}
let a = MyType(int: 1) // a.int == 1
let b = a // b.int == 1

b.int += 1 // b.int == 2
print(a) // a.int == 2

変数が複数あってその一つげ変更されても変化しないのが値型、変化する、影響があるのが参照型ということです。

struct、enumなどは値型class参照型となっています。


値渡しと参照渡し

値渡しと参照渡しの違いを理解するには以下のサイトがわかりやすいです。

ここで書かれているように変数などに値を入れる場合には直接値を書き込む場合と、値がある場所、アドレスを渡していく場合とあります。

直接書き込むのが値渡し、アドレス、場所のみを渡していくのが参照渡しということになります。

その効果はというと、値渡しだと直接値を決めていくので、変数それぞれがそれぞれの値を持っています。ある変数の値を変更しても他の変数には影響ありません。

参照渡しの場合はアドレスを渡しているので、その値を書き換えれば全てのものに影響して、値が変更されるということです。

この記事が気に入ったらサポートをしてみませんか?