6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

iOSAdvent Calendar 2023

Day 16

structとclassの違いを理解しよう!~deep copyとshallow copyの理解~

Last updated at Posted at 2023-12-21

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 // ③これはいくつ?

問題①〜③はいくつになるでしょうか?

e82d70f92dc577d951a761c8530a3b84.png

上記の図のようにコピー元のinfoのディープコピーを行い、vc1、vc2のコピーが作成される。
その際、その時点の実体もコピーされるので、info、vc1、vc2は別々の実体を指す。
vc1.info.countを10にしても、別々の実体なのでvc2.info.countinfo.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 // ③これはいくつ?

ea43565b45a7ee573cab1541a662dbcf.png

上記の図のようにコピー元のinfoのシャローコピーを行い、vc1、vc2のコピーが作成される。
その際、info、vc1、vc2は同じ実体を参照しているので、値を共有することができる!
vc1.info.countを10にすると、同じ実体を参照するので、vc2.info.countinfo.countにも変更が反映され、10になります!
答え

vc1.info.count// ① 10
vc2.info.count// ② 10
info.count // ③ 10

参考文献

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?