Avatar
値型に対する変更監視は本質的にうまくいかないと思いますけどねえ
11:52 PM
classの中でvarで保持されているstructのようなケースなら、そのstructのアイデンティティは安定しているけど、
11:52 PM
例えば classの中のdictionaryの中で保持されているような値型を考えると、
11:53 PM
dictionaryのrehashなどのタイミングで、コンテナの内部バッファ上での値のアドレスが変わったりします
11:54 PM
そういうときに操作として値 T のコピーをしている可能性がある。
11:55 PM
値型はいつでもコピーできるものとして設計されているのに対して、 アイデンティティ管理が必要な変更監視の概念を導入すると、 そういった思わぬコピーによっておかしなことになると思う
11:58 PM
コピーのタイミングだったらコピー元・コピー先を区別して、サブスクライバを複製しない、ということができるかもしれないけど、 一般にコピーの方向って意識していないはずなので変なバグが生じそうだし、
11:58 PM
実際にはSwiftではコピーのタイミングでなにかすることができないので、
11:58 PM
Copy on writeでできるのは、on writeの時点でカウンタがいくつか、を見られるだけなので、
11:58 PM
writeのタイミング、つまり変更イベント送信のタイミングですが、 そこで自分自身がコピー元なのかコピー先なのか区別できないので実装不可能な気がする。
12:00 AM
SwiftUIは値型のViewに対して変更監視のようなことができるけど、 あれは値型のViewはただのパラメータツリーを渡すためのインターフェースにすぎなくて、 ランタイムではビューツリー構造に基づくIdentityが定義・管理されていて、 そのアイデンティティのもとでイベントハンドリングしているからうまくいくのであって、
12:01 AM
ライブラリ実装によって値型のようなインターフェースの裏にクラスが隠れてて、 値の更新のたびにそのクラスとの対応付けを取ってるからできるのであって、 つまり値型に対する更新監視をしているわけではなくて、対応付けられたアイデンティティ空間の方で更新監視してる。 (edited)