奇怪的 Swift 的#selector 行为。通过#selector 参数的值完全不同

Weird Swift's #selector behavior. Value of parameter totally different through #selector

我是 Swift 的#selector 范式的新手。最终,我试图将太空船的 SKSpriteNode 移动到 CGMutablePath 上,并在太空船行驶的路径上添加废气作为 SKEmitterNodes。

但是我坚持使用#selector 范式。我正在尝试通过计时器将 SpaceShipSprite 的位置发送到 addFumeToPosition(_ point: CGPoint) 函数,以便稍后我可以将 SKEmitternode 添加到该位置。

出于某种原因,我无法理解#selector 发送的内容与我放入变量中的内容完全不同。请参阅下面的印刷品。这是怎么回事?

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)")

...

func addFumeToPosition(_ point: CGPoint){
        print("spaceShipSprite.position during point x:\(point.x) y:\(point.y)")
}

spaceShipSprite.position 定时器点之前 x:142.0 y:160.0

spaceShipSprite.position 定时器点后 x:142.0 y:160.0

spaceShipSprite.position 在定时器点 x:196092657881833.0 y:1000000000.0

你不能那样做。

target/action 的两种支持形式是

  • 无参数

    func addFumeToPosition()
    
  • 用一个参数表示受影响的 class(在本例中是 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 属性添加到函数中。