代码之家  ›  专栏  ›  技术社区  ›  user594883

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

  •  0
  • user594883  · 技术社区  · 7 年前

    我对斯威夫特的#选择器范式一无所知。最终,我试图将一艘宇宙飞船的尾翼移动到一条CGMutablePath上,并在飞船所行驶的路径上添加尾翼时产生的废气。

    然而,我仍然停留在#选择器范式上。我正试图通过计时器将太空船精灵的位置发送到 addFumeToPosition(_ point: CGPoint) 函数,以便稍后我可以将SKEmitternode添加到该位置。

    由于某种原因,我无法理解#选择器发出的东西与我输入变量的东西完全不同。请看下面的图片。这是怎么回事?

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

    太空船精灵。定时器点x之前的位置:142.0 y:160.0

    太空船精灵。定时器点x后的位置:142.0 y:160.0

    太空船精灵。定时器点x期间的位置:196092657881833.0 y:100000000.0

    1 回复  |  直到 7 年前
        1
  •  2
  •   vadian    7 年前

    你不能那样做。

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

    • 无参数

      func addFumeToPosition()
      
    • 一个参数表示受影响的类(在这种情况下 Timer 实例)

      func addFumeToPosition(_ 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 属性。