Swift

Swift: 構造体のストアドプロパティの変更


どうも、ささおです。

 

構造体のストアドプロパティの変更と

クラスのストアドプロパティの変更はちょっと違うのでメモしていきます。

 

普段はUIKitなどのクラスを中心に触っていると構造体を触って時におやっ??となることがあります。

クラス

class Note {
    var text: String
    init(text: String) {
        self.text = text
    }
}

let note = Note(text: "ガンバ")
note.text = "ルンバ"

これがクラス。

いつもの感じです。

注目していただきたいのが、

noteという定数を定義して、

textという変数で定義したプロパティに変更を加えています。

 

これは全く問題ありません。

それでは問題の構造体を見ていきましょう。

 

構造体

struct Note {
    var text: String
    init(text: String) {
        self.text = text
    }
}

let note = Note(text: "ガンバ")
note.text = "ルンバ" // error : <span class="s1"><b>change 'let' to 'var' to make it mutable</b></span>

これが構造体です。

classの部分をstructに変更しただけ

でエラーになってしまいます。

「change ‘let’ to ‘var’ to make it mutable」はlet で定義しているものは変更できないからvar に変更してね!

というエラーです。

 

??

「変更してるのはあくまでもvar で定義したtextプロパティなんだから問題なくない!?」と思いますが、

この考え方はクラスと構造体を近いものとして考えすぎなのかもしれません。

 

構造体とはあくまでも「プロパティの組み合わせで表させる型」ということらしいのです。

つまりストアドプロパティのもつ値を変更することは
その定数を変更していることと同じということです。

参照型・値型

参照

classのインスタンスの定数

let note = Note(text: "ガンバ")

この場合、noteに代入したのはNote(text: “ガンバ”)のインスタンスのポインタなのです。

つまり、メモリ上のどこにそのインスタンスがあるのか(アドレス)の情報をnoteに代入しているということになり、

上記のようにプロパティを変更しただけではアドレスが変更されないということでエラーが出ないのです。

 

値型

structのインスタンスの定数

let note = Note(text: "ガンバ")

この場合、noteに代入したのはNote(text: “ガンバ”)のインスタンスのコピーなのです。

つまり、インスタンスをnoteに代入していることになり

上記のようにプロパティの変更が、そのまま定数の変更になるのです。

 

終わり

微妙にずれた気がする

 

 

 

 

 

 


ABOUT ME
ささお
3年目iOSエンジニア。 スタートアップで働いておりやす。 プログラミングスクールとエンジニアのキャリアを考えたい。 作ったアプリ - https://apps.apple.com/us/app/loverprofile/id1463563845?l=ja&ls=1