2017-01-20 2 views
2

Так есть этот класс в SpriteKit:Swift 3: Наблюдение свойство только для чтения

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

    ... 

    open var scene: SKScene? { get } 

    ... 

Я хотел бы, чтобы вызвать определенную логику, когда scene собственность становится не равна нулю.

Это то, что я пробовал:

class MyNode : SKNode { 

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

, но я получаю сообщение об ошибке: Cannot observe read-only property 'scene'; it can't change, которая имеет смысл в теории.

На практике стоимость имущества делает изменения:

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

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

есть какая-то черная магия, что я мог бы использовать вместо этого?

ответ

3

Объект рассчитан, значение изменяется, но оно никогда не устанавливается. Он рассчитывается из других значений.

Поэтому нет смысла размещать didSet.

От 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.

Если мы говорим о SKNode.scene, вероятно, это просто метод аксессор к частному Ивар _scene, или она динамически идет вверх по дереву и возвращает корень.

Поскольку это класс Obj-C, вы, вероятно, можете использовать KVO для наблюдения за значением, если вам действительно это нужно.

+0

Нашел этот вопрос, используя KVO для вычисляемых свойств: http://stackoverflow.com/questions/36555492/kvo-on-swifts-computed-properties – scribu

Смежные вопросы