奇怪的 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
属性添加到函数中。
我是 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
属性添加到函数中。