如何将 [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()