struct (値型)
各インスタンスはデータのコピーを保持する!
変数や定数に代入するときや関数に渡すときに、新しいインスタンス (コピー) を作成する
class (参照型)
各インスタンスはデータのコピーを共有する!
一度初期化された型は、変数または定数に割り当てられるか、関数に渡されると、同じ既存のインスタンスへの参照を返す!
deep copy(深いコピー)でstructを理解!
ディープコピー(深いコピー)とは完全な複製を作成するコピーです。
生成時点のデータをコピーした実体を作成する。
完全な複製を作成するので、コピー元とコピー先は別々の実体を参照することとなる。
サンプルコードをPlaygroundで動かしてみて、理解を深めましょう!
struct Info {
var count = 0
}
class VC1 {
var info: Info
init(info: Info) {
self.info = info
}
}
class VC2 {
var info: Info
init(info: Info) {
self.info = info
}
}
let info = Info()
let vc1 = VC1(info: info)
let vc2 = VC2(info: info)
vc1.info.count = 10
vc1.info.count// ①これはいくつ?
vc2.info.count// ②これはいくつ?
info.count // ③これはいくつ?
問題①〜③はいくつになるでしょうか?
上記の図のようにコピー元のinfoのディープコピーを行い、vc1、vc2のコピーが作成される。
その際、その時点の実体もコピーされるので、info、vc1、vc2は別々の実体を指す。
vc1.info.count
を10にしても、別々の実体なのでvc2.info.count
とinfo.count
に変更は反映されず、0になります!
答え
vc1.info.count// ① 10
vc2.info.count// ② 0
info.count // ③ 0
shallow copy (浅いコピー)でclassを理解!
シャローコピー(浅いコピー)とは実体(データ)のコピーを行わないコピーです。
そのため、コピーを共有することができる!
コピーを共有するので、コピー元とコピー先は同じ実体を参照することとなる。
サンプルコードをPlaygroundで動かしてみて、理解を深めましょう!
class Info {
var count = 0
}
class VC1 {
var info: Info
init(info: Info) {
self.info = info
}
}
class VC2 {
var info: Info
init(info: Info) {
self.info = info
}
}
let info = Info()
let vc1 = VC1(info: info)
let vc2 = VC2(info: info)
vc1.info.count = 10
vc1.info.count// ①これはいくつ?
vc2.info.count// ②これはいくつ?
info.count // ③これはいくつ?
上記の図のようにコピー元のinfoのシャローコピーを行い、vc1、vc2のコピーが作成される。
その際、info、vc1、vc2は同じ実体を参照しているので、値を共有することができる!
vc1.info.count
を10にすると、同じ実体を参照するので、vc2.info.count
とinfo.count
にも変更が反映され、10になります!
答え
vc1.info.count// ① 10
vc2.info.count// ② 10
info.count // ③ 10
参考文献