2

これをレーダーレポートとして提出しましたが、彼らが何をするかわかりません。

私が持っているのは構造体で、その構造体はインスタンス化され、クラス インスタンスによって集約されます。

構造体はオブジェクトであるため、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()
4

0 に答える 0