Avatar
そういうことかw
1:18 PM
値型だとインスタンス共有が存在しないので、振る舞いが定まります。
1:18 PM
これをドキュメントやコーディング規約(たとえば必ず防御的コピーをする)とかで管理しようとしても
1:18 PM
巨大なコードベースでは次第にそれが破られてきて、そのうち何が起こるか確信できないコードの塊が生まれるんじゃないかと思います。
1:19 PM
イミュータブルクラスだとそういう問題はないですが、
1:19 PM
状態の更新が大変です。
1:19 PM
class User { let name: String let age: Int ... } var user = User(name: "Swift", age: 4) user = user(name: user.name, age: user.age + 1) (edited)
1:19 PM
インスタンスを作り変えないといけないです。
1:20 PM
ミュータブルクラスなら楽なのに。 // ミュータブルクラス class User { var name: String var age: Int ... } let user = User(name: "Swift", age: 4) user.age += 1 // 楽 (edited)
1:21 PM
これを struct でやると // struct struct User { var name: String var age: Int } var user = User(name: "Swift", age: 4) user.age += 1 // 楽 (edited)
1:21 PM
楽だけどインスタンス共有もされなくて挙動が定まってうれしい
❤ 7
1:22 PM
と両者のいいとこどりをできます(単純化すれば)。
1:22 PM
で、とは言っても普通の言語だとコレクションが参照型なので
1:22 PM
値型でできることの範囲が結構狭いんですが、
1:23 PM
Swift だとコレクションも値型なので、やろうと思えば全部値型で書くこともできなくはないです。
1:23 PM
標準ライブラリもほとんど値型しかないですし。
1:23 PM
というわけで、値型って Swift にとってとても重要だと思うんですけど、
1:23 PM
実際にはいろいろ限界があって難しいこともあり、
1:24 PM
みなさん実際使っててどうですか?ということを話し合ってみたいです。
1:24 PM
こういうのは値型は難しいよね、とか、ここが値型でおもしろいよね、とか何かありますか?