奇怪的斯威夫特的#selector行为。参数值通过#selector完全不同

时间:2017-11-19 05:57:48

标签: ios swift timer selector

我是Swift的#selector范例的新手。最终,我试图将一个spaceShip的SKSpriteNode移到CGMutablePath上,并在spaceShip行进的路径上添加废气作为SKEmitterNodes。

但是我坚持#selector范式。我试图通过计时器将SpaceShipSprite的位置发送到MIJ.run('Duplicate...','duplicate range=&values') 函数,以便稍后我可以将SKEmitternode添加到该位置。

由于某种原因,我无法理解#selector的东西发出的东西与我放入变量的东西完全不同。请看下面的印刷品。这里发生了什么?

addFumeToPosition(_ point: CGPoint)

...

let spaceShipSprite = SKSpriteNode(texture: SKTexture(image: #imageLiteral(resourceName: "spaceShip")))

spaceShipSprite.position = CGPoint(x: 142.0, y:160.0)
spaceShipSprite.name = "spaceShip"
self.addChild(spaceShipSprite)

print("spaceShipSprite.position before timer point x:\(spaceShipSprite.position.x) y:\(spaceShipSprite.position.y)")

let gameTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector:#selector(addFumeToPosition(_: )), userInfo: spaceShipSprite.position, repeats: true)

print("spaceShipSprite.position before timer point x:\(spaceShipSprite.position.x) y:\(spaceShipSprite.position.y)")
在定时器点x:142.0 y:160.0

之前的

spaceShipSprite.position 定时器点x后的

spaceShipSprite.position:142.0 y:160.0

定时器点x期间的

spaceShipSprite.position:196092657881833.0 y:1000000000.0

1 个答案:

答案 0 :(得分:2)

你做不到。

目标/行动的两种支持形式是

  • 没有参数

    func addFumeToPosition()
    
  • 使用一个参数表示受影响的类(在本例中为Timer实例)

    func addFumeToPosition(_ timer: Timer)
    

如果传递参数,则它必须是Timer实例。

必须通过userInfo参数传递和处理所有自定义参数。

func addFumeToPosition(_ timer: Timer){
    let point = timer.userInfo as! CGPoint
    print("spaceShipSprite.position during point x:\(point.x) y:\(point.y)")
}

注意:在Swift 4中,您可能必须将@objc属性添加到函数中。