値型と参照型について説明します。
値型
値型の変数はデータを直接格納します。
構造体、列挙型が値型になります。
var a = "apple"
//変数bにaを代入する
var b = a
ゲームのヒィールド上にaという名前でりんごが召喚される(インスタンス化)
りんごが複製されて、bという名前でヒィールド上に召喚される
ヒィールド上にりんごが2個置かれている状態
ヒィールド上に実体化した🍎がそれぞれ存在しているので、どちらかの値を変化させても影響しないのが値型の特徴です。代入の際に値がコピーされるのが値型になります。
var a = "apple"
var b = a
//変数aにbananaを代入する
b = "banana"
print(("a:\(a)")
print("b:\(b)")
- - - - - - - - - - - - - - - - - - - - -
a:apple //b = bananaによって影響は受けない
b:banana
参照型
参照型の変数はデータ (オブジェクト) への参照を格納します。
クラスが参照型になります。
// フルーツクラス作成する
class Fruit {
var name: String
init(name: String) {
self.name = name
}
}
var a = Fruit(name: "apple")
// bにaを代入
var b = a
// 変数aのインスタンスのnameプロパティをbananaに変更する
a.name = "banana"
print("a: \(a.name)")
print("b: \(b.name)")
- - - - - - - - - - - - - - - - - - - - -
a:banana //b = bananaによって変更されている
b:banana
ゲームのヒィールド上にaという名前でりんごが召喚される(インスタンス化)
りんご自体は複製されず、りんごが召喚された座標がコピーされる
ヒィールド上にりんごが1個置かれている状態
代入の際に値ではなく、データ自体への参照先を渡すのが参照型。
変数aの参照先が変数bにコピーされているため、a.name = "banana"
で変数aの値を変えた場合でも変数bが参照している座標は同じであるため、値の変更に影響を受けてしまう。
※ここでの参照とはデータ自体が保存されているメモリ上の領域のアドレスのことを指す。
まとめ
変数、定数をコピーしたときに値型と参照型に違いがある。
値型:インスタンスがコピーされる
参照型:参照先がコピーされる