计时器在 return 中给我随机数
Timer is giving me random numbers in return
func executeSpawningStar(startPosition: CGPoint) {
print(startPosition)
}
此函数由以下行执行:
gameTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(executeSpawningStar), userInfo: (startPosition: 0, 0), repeats: true)
这是印刷品:
(1421871380267.49, 9.22337203685478e+18)
(1421902263851.49, 9.22337203685478e+18)
(1421902263851.49, 9.22337203685478e+18)
当我具体说任何随机数时,这怎么可能呢?我看到任何数字插入 returns 这个非常随机的数字。怎么会?
你这样做全错了。 executeSpawningStart
函数的参数必须是计时器。不可能是别的。然后你从定时器的 userInfo
属性.
得到起始位置
所以你需要:
func executeSpawningStar(_ timer: Timer) {
if let startPosition = timer.userInfo as? CGPoint {
print(startPosition)
}
}
这假设您在创建计时器时设置的 userInfo
实际上是一个 CGPoint
(我基于您原来的 executeSpawningStar
方法。
但是在调用 scheduledTimer...
时,您实际上并未将 CGPoint
传递给 userInfo
参数。它似乎是某种元组。您可能想传递 CGPoint(x: 0, y: 0)
而不是 (startPosition: 0, 0)
.
@rmaddy的回答是正确的,但是如果你的部署目标是iOS10.0+(或者macOS 10.12+或者tvOS 10.0+或者watchOS 3.0+),你可以使用scheduledTimer
的版本它采用块而不是选择器,并且完全避免使用 userInfo
。示例:
var point = CGPoint(x: 0, y: 0)
gameTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
print(point)
point.x += 1
}
func executeSpawningStar(startPosition: CGPoint) {
print(startPosition)
}
此函数由以下行执行:
gameTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(executeSpawningStar), userInfo: (startPosition: 0, 0), repeats: true)
这是印刷品:
(1421871380267.49, 9.22337203685478e+18)
(1421902263851.49, 9.22337203685478e+18)
(1421902263851.49, 9.22337203685478e+18)
当我具体说任何随机数时,这怎么可能呢?我看到任何数字插入 returns 这个非常随机的数字。怎么会?
你这样做全错了。 executeSpawningStart
函数的参数必须是计时器。不可能是别的。然后你从定时器的 userInfo
属性.
所以你需要:
func executeSpawningStar(_ timer: Timer) {
if let startPosition = timer.userInfo as? CGPoint {
print(startPosition)
}
}
这假设您在创建计时器时设置的 userInfo
实际上是一个 CGPoint
(我基于您原来的 executeSpawningStar
方法。
但是在调用 scheduledTimer...
时,您实际上并未将 CGPoint
传递给 userInfo
参数。它似乎是某种元组。您可能想传递 CGPoint(x: 0, y: 0)
而不是 (startPosition: 0, 0)
.
@rmaddy的回答是正确的,但是如果你的部署目标是iOS10.0+(或者macOS 10.12+或者tvOS 10.0+或者watchOS 3.0+),你可以使用scheduledTimer
的版本它采用块而不是选择器,并且完全避免使用 userInfo
。示例:
var point = CGPoint(x: 0, y: 0)
gameTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
print(point)
point.x += 1
}