如何将 [NSTimer] 中的计时器设置为零?
How to set the timers in [NSTimer] to nil?
目标是在选择 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 = []
我想肯定是不够的,因为它只会清除数组但保持计时器实例完好无损。
解决这个问题的最佳方法是什么?
您不能在 Swift 中设置非 nil 的局部作用域变量,因为它不是 var
而是 let
.
只是 nil
循环后的计时器变量。
这是因为您处于循环中,您无法改变正在迭代的对象。
for timer in timers {
// timer is initialized here like "let timer = timers[index]"
}
使循环中的定时器失效,然后设置
timers = nil
或
timers.removeAll()
你基本上是在使所有计时器无效并杀死它们,然后重新创建它们,所以只需使用 removeAll(keepCapacity:)
.
清空两个循环之间的数组
你能不能让数组失效然后从数组中删除?为什么你需要数组中的可选计时器?
array.forEach{
[=10=].invalidate()
}
array.removeAll()
目标是在选择 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 = []
我想肯定是不够的,因为它只会清除数组但保持计时器实例完好无损。
解决这个问题的最佳方法是什么?
您不能在 Swift 中设置非 nil 的局部作用域变量,因为它不是 var
而是 let
.
只是 nil
循环后的计时器变量。
这是因为您处于循环中,您无法改变正在迭代的对象。
for timer in timers {
// timer is initialized here like "let timer = timers[index]"
}
使循环中的定时器失效,然后设置
timers = nil
或
timers.removeAll()
你基本上是在使所有计时器无效并杀死它们,然后重新创建它们,所以只需使用 removeAll(keepCapacity:)
.
你能不能让数组失效然后从数组中删除?为什么你需要数组中的可选计时器?
array.forEach{
[=10=].invalidate()
}
array.removeAll()