2017-08-27 3 views
0

Je suis en train de créer un bloc d'action personnalisé pour un SKSpriteNode, je le code suivant:KeyPaths intelligents Swift 4 ne fonctionne pas correctement

let sprite = SKSpriteNode(color: SKColor.red, size: CGSize(width: 50, height: 50)) 
sprite.position = CGPoint(x: 320, y: 240)  
self.addChild(sprite) 

let animation = SKAction.customAction(withDuration: 0, actionBlock: { 
    (node, elapsedTime) in 

    var initialValue : CGFloat? 
    initialValue = node[keyPath: \SKSpriteNode.position.x] //Extraneous argument label 'keyPath:' in subscript 

    node[keyPath: \SKSpriteNode.position.x] = 10 //Ambiguous reference to member 'subscript' 
}) 

sprite.run(animation) 

Je reçois deux erreurs, la première est que le compilateur est pensant que j'ai un argument Extraneous de « KeyPath », ce qui est pas le cas, parce que si je devais l'enlever comme il l'indique, je reçois cette erreur:

Cannot convert value of type 'ReferenceWritableKeyPath' to expected argument type 'String'

la deuxième erreur que je reçois est:

Ambiguous reference to member 'subscript'

Je ne suis pas exactement sûr pourquoi je reçois toutes ces erreurs, et je ne suis pas sûr exactement ce que les erreurs signifient. Si quelqu'un pouvait me les expliquer et proposer une solution, ce serait formidable. Merci d'avance.

Répondre

1

Le keyPath ne fonctionne pas car node a le type SKNode et non SKSpriteNode. Vous pouvez utiliser une distribution conditionnelle pour établir que le nœud est SKSpriteNode:

let animation = SKAction.customAction(withDuration: 0, actionBlock: { 
    (node, elapsedTime) in 

    var initialValue : CGFloat? 
    if let spritenode = node as? SKSpriteNode { 
     initialValue = spritenode[keyPath: \SKSpriteNode.position.x] 

     spritenode[keyPath: \SKSpriteNode.position.x] = 10 
    } 
})