我查看了有关此主题的现有帖子,并用Google搜索,但我无法识别我的错误或让我的工作。我在类ChessPlayer中有一个函数iterativeDeepening()。说完15秒后,我想停止函数内的进一步迭代。在下面的代码中,函数" flagSetter"永远不会被调用。如果我使用NSTimer.fire(),则立即调用该函数,而不是在15秒后调用。我尝试在iterativeDeepening()之前或之后放置flagSetter函数。这两种情况都不起作用。我做错了什么?
class ChessPlayer {
var timeoutFlag = false
//Code
func iterativeDeepening() {
***//variables and constants***
let timer = NSTimer.scheduledTimerWithTimeInterval(15.0, target: self, selector: #selector(self.flagSetter), userInfo: nil, repeats: false)
***while minDepth <= maxDepth
{
// Loop iteration code
if timeoutFlag { break out of loop }
}***
}
@objc func flagSetter(timer: NSTimer) {
print("flag changed to true")
self.timeoutFlag = true
timer.invalidate()
}
}
要求:
答案 0 :(得分:0)
以下是您的解决方案:在函数外部定义timer
,以便您可以从其他函数中使其无效。现在,你的计时器是在一个函数内部定义的,因此只能在该函数内部进行更改,但这不是你想要的。通过执行以下操作来修复此问题:在var timeoutFlag = false
下方var timer = NSTimer()
下方。然后在你的函数iterativeDeepening()
里面摆脱let
。然后它一切都会工作!!
以下是您的代码,改编自Hasya的答案和您提供的代码。
class ChessPlayer {
// Declare timer and timeoutFlag
var timer = NSTimer()
var timeoutFlag = false
func iterativeDeepening() {
self.timer = NSTimer.scheduledTimerWithTimeInterval(15.0, target: self, selector: “timerEventOccured”, userInfo: nil, repeats: true)
}
func timerEventOccured() {
print("timerEventOccured was called.")
timeoutFlag = true
self.timer.invalidate()
}
}
override func viewDidUnload() {
super.viewDidUnload()
self.timer.invalidate()
}
}
答案 1 :(得分:0)
我是Objective-c的爱好者,在我的项目中从未使用过Swift。谷歌搜索NSTimer Swift,我发现了以下步骤正确实现NSTimer。
我们需要定义我们的NSTimer。我们需要的第一个变量是一个名为NSTimer类型的计时器的变量。我们这样做:
var timer = NSTimer()
启动NSTimer计时器:
timer = NSTimer.scheduledTimerWithTimeInterval(15.0, target:self, selector:#selector(ChessPlayer.flagSetter(_:)), userInfo: nil, repeats: false)
你的方法flagSetter应该定义为:
func flagSetter(timer: NSTimer) {
print("flag changed to true")
self.timeoutFlag = true
timer.invalidate()
}
现在肯定会工作,因为我已经制作了我的第一个应用程序,仅仅是针对这个问题,在Swift中制作。检查我如何放置我的选择器。顺便提一句,你是对的。
如果您需要有关选择器的更多信息,请查看以下主题:@selector() in Swift?