目标是在tableView中选择一行时触发计时器,同时摆脱旧的计时器。因为我不想留下任何内存,我想它们无效是不够的。新的计时器可能不同(我在这里简化了代码),所以我不想重复使用它们。
我尝试将数组中的计时器设置为nil
,但是在timer = nil
行上,Xcode会出错。
class DataModel() {
var timers = [NSTimer]()
}
class TableViewController: UITableViewController {
var dataModel = DataModel()
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if dataModel.timers.count != 0 {
for timer in dataModel.timers {
timer.invalidate()
timer = nil //"Cannot assign to value: timer is a let constant."
}
}
for i in 0...10 {
var timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(i), target: self, selector: "doSomething", userInfo: nil, repeats: false)
dataModel.timers.append(timer)
}
}
}
我已尝试制作计时器实例选项NSTimer?
,但这也不起作用,我可能在for timer in dataModels.timer
行中做错了。我需要if let
构造吗?
class DataModel() {
var timers = [NSTimer?]()
}
class TableViewController: UITableViewController {
var dataModel = DataModel()
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if dataModel.timers.count != 0 {
for timer in dataModel.timers {
timer!.invalidate()
timer = nil // Error here
}
}
for i in 0...10 {
var timer = NSTimer?()
timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(i), target: self, selector: "doSomething", userInfo: nil, repeats: false)
dataModel.timers.append(timer)
//timer = nil // No error here.
}
}
}
设置dataModel.timers = []
肯定不够,我想,因为它只是清除数组但保留计时器实例。
解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
你基本上是无效并杀死所有的计时器,然后重新创建它们,所以只需用removeAll(keepCapacity:)
清空2个循环之间的数组。
答案 1 :(得分:1)
你可以在数组中失效然后删除吗?你怎么在阵列中需要可选的定时器?
array.forEach{
$0.invalidate()
}
array.removeAll()
答案 2 :(得分:0)
你不能在Swift中设置局部范围变量而不是nil,因为它不是var
而是let
。
循环后只需nil
个定时器变量。
答案 3 :(得分:0)
这是因为你处于一个循环中,你不能改变正在迭代的对象。
for timer in timers {
// timer is initialized here like "let timer = timers[index]"
}
使循环中的计时器无效,然后设置
timers = nil
或
timers.removeAll()