これをレーダーレポートとして提出しましたが、彼らが何をするかわかりません。
私が持っているのは構造体で、その構造体はインスタンス化され、クラス インスタンスによって集約されます。
構造体はオブジェクトであるため、set/get オブザーバーだけでなく、setter と getter があります。
これらのオブザーバーを使用して、構造体インスタンスの配列のインデックスを再作成しています。
取り決めは、構造体に「可視」フラグがあることです(私の実装では)。そのフラグがオフになっている (false に設定されている) 場合、コンテナー クラスはすべての構造体のインデックスを再作成して、現在非表示になっている (または現在表示されている) インスタンスをインデックスから削除する必要があります。
そのための最善の方法は、構造体インスタンスをインスタンス化するときに、それにコンテナー インスタンスへの参照を渡し、didSet { myContainer.reIndex() } ハンドラーをセットアップすることです。
問題は、構造体とクラスの動作が異なるように見えることです。値/参照の問題だと思います。
クラスでは、インスタンスの外部値は didSet が呼び出されるまでに設定されます。つまり、外部オブジェクトを呼び出してインデックスを再作成すると、新しい値が表示されます。
構造体では、didSet が実行されるまで、これは当てはまらないようです。
RADAR レポートで提出した遊び場を含めます。
私の質問は次のとおりです。構造体にはセッター/ゲッターオブザーバーが必要だと思いますか? 彼らはセッター/ゲッターを持っているべきですか?
回避策があります。値を変更した後、インデクサーを呼び出します。それはそれほど優雅ではありません。
遊び場 (以下のコードでは、didSet ハンドラー中に発行されたさまざまな値を参照してください):
struct StructA
{
let classBInstance:ClassB
init ( inClassB:ClassB )
{
self.classBInstance = inClassB
self.testProperty = 0
}
var testProperty:Int = -1
{
didSet
{
self.classBInstance.reactToSetStruct ( )
}
}
}
class ClassA
{
let classBInstance:ClassB
init ( inClassB:ClassB )
{
self.classBInstance = inClassB
self.testProperty = 0
}
var testProperty:Int = -1
{
didSet
{
self.classBInstance.reactToSetClass ( )
}
}
}
class ClassB
{
var structAInstance:StructA! = nil
var classAInstance:ClassA! = nil
init()
{
self.structAInstance = StructA ( inClassB:self )
self.classAInstance = ClassA ( inClassB:self )
}
func doSetStruct()
{
println ("Before Set: Struct Property Value is \(self.structAInstance.testProperty)")
self.structAInstance.testProperty = 1
println ("After Set: Struct Property Value is \(self.structAInstance.testProperty)")
}
func doSetClass()
{
println ("Before Set: Class Property Value is \(self.classAInstance.testProperty)")
self.classAInstance.testProperty = 1
println ("After Set: Class Property Value is \(self.classAInstance.testProperty)")
}
func reactToSetStruct()
{
println ("Struct Value is now \(self.structAInstance.testProperty)")
}
func reactToSetClass()
{
println ("Class Value is now \(self.classAInstance.testProperty)")
}
}
let classTest:ClassB = ClassB()
classTest.doSetStruct()
classTest.doSetClass()