Swift

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


どうも、ささおです。

 

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

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

 

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

クラス

これがクラス。

いつもの感じです。

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

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

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

 

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

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

 

構造体

これが構造体です。

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

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

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

というエラーです。

 

??

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

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

 

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

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

参照型・値型

参照

classのインスタンスの定数

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

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

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

 

値型

structのインスタンスの定数

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

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

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

 

終わり

微妙にずれた気がする

 

 

 

 

 

 


コメントを残す

*