見出し画像

Swiftではじめてみよう!- 構造体を理解。

クラスと構造体との使い分けが今ひとつ理解が足りません。構造体をまとめておきたいと思います。

違いがまとめてある以下サイト。

まず構造体はクラスと違って継承できません。継承が必要であればクラスを使う必要があります。

次にクラスでは初期化(イニシャライザ)のコードがが必須ですが、構造体ではなくても良いです。

最後に、クラスはデータを参照渡しで、構造体は値渡し。ということ。これが分かりにくいとことですので同じ内容の構造体、クラスを作り確認していきます。

構造体

struct UserStruct {
    var age: Int
    
    init (age: Int){
        self.age = age
    }
}

クラス

class UserClass {
    var age: Int
    
    init (age: Int){
        self.age = age
    }
}

全く同じ内容のコードです。

それぞれ変数に代入してインスタンス化してデータを取ってみます。

まず、構造体(struct )を一つ作っって。

var userStruct1 = UserStruct(age: 30)

2つ目はこの変数を使ってもう一つ作ります。

var userStruct2 = userStruct1

これで2つの構造体から作った変数に入ったプロパティを比べます。ここで

userStruct2.age = 40

"userStruct2.age"に"userStruct1"と違う値を入れます。そして2つ変数の値を出力して比べてみます。

print(userStruct1.age)
print(userStruct2.age)

30
40

となります。一つ目の構造体を引き継いで2つ目を作りました。ここで大事なことは2つ目の値を変更しても一つ目のデータには影響しないということです。構造体は値渡しということが分かります。

それに対してクラスはというと、

構造体と同じようにそれぞれ変数に代入してインスタンス化してデータを取ってみます。

var userClass1 = UserClass(age: 30)
var userClass2 = userClass1

"userStruct2.age"に"userStruct1"と違う値を入れます。

userClass2.age = 40

それでは代入した2つの変数のプロパティを出力してみます。

print(userClass1.age)
print(userClass2.age)

40
40

2つとも"40"と出ました。後で変更した分に影響されています。このように変数を作るときに代入して作ったものは後で値を変更した物に影響されて変更されました、

このように最初に作った変数を使ってさらに作成した場合のは元の値を常に参照していることになります。つまり参照しているというのは場所が変わっても同一の値となるということです。

これは使う場所で変更されれば他のところまで影響されてしまうことになるので注意する必要があります。

構造体とクラスの違い値渡しと参照渡しの違いでした。

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