2017-01-20 6 views
2

So gibt es diese Klasse in SpriteKit:Swift 3: Beobachten einer schreibgeschützten Eigenschaft

open class SKNode : UIResponder, NSCopying, NSCoding, UIFocusItem { 

    ... 

    open var scene: SKScene? { get } 

    ... 

Ich mag würde eine gewisse Logik auszulösen, wenn die scene Eigenschaft nicht null wird.

Dies ist, was ich versuchte:

class MyNode : SKNode { 

    override var scene: SKScene? { 
     didSet { 
      if scene != nil { 
       // my custom logic 
      } 
     } 
    } 
} 

aber ich erhalte eine Fehlermeldung: Cannot observe read-only property 'scene'; it can't change den Sinn in der Theorie macht.

In der Praxis ist der Wert der Eigenschaft tut Änderung:

let node = SKNode() 
print(node.scene?) // nil 

scene.addChild(node) 
print(node.scene?) // SKScene 

Gibt es einige schwarze Magie, die ich stattdessen verwenden könnte?

Antwort

3

Die Eigenschaft ist berechnet, der Wert ändert sich aber es wird nie festgelegt. Es wird aus anderen Werten berechnet.

Daher macht es keinen Sinn, dort eine didSet zu setzen.

Von Read-Only Computed Properties

A computed property with a getter but no setter is known as a read-only computed property. A read-only computed property always returns a value, and can be accessed through dot syntax, but cannot be set to a different value.

Wenn wir über SKNode.scene sprechen, dann ist es wahrscheinlich nur eine Accessor-Methode zu einem privaten Ivar _scene, oder, um es dynamisch den Baum nach oben geht und gibt die Wurzel.

Da es sich um eine Obj-C-Klasse handelt, können Sie wahrscheinlich KVO verwenden, um den Wert zu beobachten, wenn Sie es wirklich brauchen.

+0

Diese Frage zur Verwendung von KVO für berechnete Eigenschaften gefunden: http://stackoverflow.com/questions/36555492/kvo-on-swifts-computed-properties – scribu

Verwandte Themen