2017-09-29 1 views
0

私のSpriteKitでは、スプライトのSKPhysicsBodyfieldBitMaskプロパティにプロパティオブザーバを追加したいと考えています。 fieldBitMaskプロパティが変更されたときに通知を受けて、何らかの措置を講じることができます。iOSライブラリクラスの既存のプロパティにプロパティオブザーバを追加する

私はSKPhysicsBodyをオーバーロードしましたが、通常のSKPhysicsBodyオブジェクトのようにスプライトノードにオーバーライドされたクラスを割り当てようとしたときに、エラーが発生しました。私はSKPhysicsBodyの拡張についても考えましたが、Appleのドキュメントでは、「拡張機能は型に新しい機能を追加することができますが、既存の機能を上書きすることはできません」と述べています。それはプロパティオブザーバです。

私が作成した新しいカスタムクラスにプロパティオブザーバを作成する方法は分かっています。しかし、Appleライブラリの一部であるクラスの既存のプロパティにプロパティオブザーバを追加する最善の方法は何ですか?

+1

このプロパティを購読する必要がありますか?私は良い建築の中でこのプロパティの値を変更すべきではないと思います。このプロパティは物理オブジェクトのタイプを決定するため、オブジェクトのタイプを変更する必要がある場合は、SKPhysicsBodyの新しいインスタンスを作成することができます。 –

+1

いいえ、これは私のプロジェクトにとって便利なアプローチだと思いました。私はいくつかの物理フィールドといくつかのスプライトを持っています。物理フィールドがスプライトにどのような影響を与えるかを定期的に変更したいのです。いくつかの要素がフィールドを変更する可能性があり、コード内の複数箇所の変更に応答するのではなく、プロパティオブザーバで 'fieldBitMask'を設定する方が簡単だと思いました。次に、プロパティオブザーバのための 'didSet'のフィールドの変更に応答する必要があります。これはうまくいかないので、私は長いアプローチを取る必要があります。 – peacetype

答えて

1

あなたはそのようなSKPhysicsBodyをサブクラス化することができます

class Subclass: SKPhysicsBody { 
    override var fieldBitMask: UInt32 { 
     didSet { 
      print(fieldBitMask) 
     } 
    } 
} 
+0

これはうまくいくはずです。少なくともSwift 4ではエラーは出ませんが、以前のバージョンからはおそらく可能でした:) –

+1

これを初期化してスプライトノードに割り当てることはできますか?通常、この 'spriteNode.physicsBody = SKPhysicsBody(circleOfRadius:2)'のようにSKPhysicsBodyを割り当てることができますが、あなたのサブクラスには初期化子がありません。あなたのサブクラスに 'super.init()'を追加しようとしましたが、エラーがたくさんありました。 – peacetype

+1

ああ、それについては考えておらず、すべての初期化子や関数が継承されていないように見えますが、Andrew Romanovの答えは、おそらくあなたの場合より適しています! –

1

私はあなたがKey Value Observingを使用することができると思います。オブザーバーを変更するプロパティに追加できます。
あなたのオブザーバークラスでimplementobserveValue(forKeyPath:of:change:context:)メソッドを使用する必要があります。

Hereスウィフトの例(「Key-Value Observing」の部分)があります。

+1

3番目のリンクには、「動的」修飾子と '@ objc'属性を監視したいプロパティに追加するという要件があります。これには、既存のiOSクラスを上書きする必要があります。だから、このアプローチはTrevörAnne Deniseの答えと同じ問題を抱えています。クラスをオーバーライドしてもスプライトノードに割り当てることはできません。 – peacetype

+0

SKPhysicsBodyはObjective-Cクラスですので、変更せずにKey Value Observingを使用することができます。 –

+0

Objective-Cコードで使用されるSwiftクラスに、dynamic属性と@objc属性を追加する必要があります。 –

関連する問題