如何在 Swift 中使用计时器避免 "variable was written to, but never read" 警告

How to avoid "variable was written to, but never read" warning with a timer in Swift

我正在使用此代码来延迟 tableView 的 appearance/disappearance。

    var timer = NSTimer()
    let delay = 0.5
    timer = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false) // Warning: Variable 'timer' was written to, but never read

也许是我对计时器变量做错了什么,如何避免这个错误?我知道我可以使用 print(timer) 语句,但我认为这不是最佳实践。

不要创建 timer 变量,因为它不是必需的。只需执行以下操作:

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false)

即使您不需要 delay 变量,除非它动态变化。

在您的示例中,您根本不需要 NSTimer 的变量。这样你就可以删除

var timer = NSTimer()

正如用户代码所指出的那样,它已经在那里启动了一个计时器。所以如果你需要这个变量你应该做

var timer:NSTimer

这不会启动计时器,但会将 属性 的类型设置为正确的类型。

但对您的问题的一个简短回答是,您可以使代码看起来像这样:

let delay = 0.5
NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false)

警告将消失。

永远记得在class deinit 或视图被删除时使计时器失效,否则将来会导致难以发现的内存崩溃。

所以只需添加:

deinit {
  self.timer.invalidate()
}

在你的 class.

由于没有 deinit 计时器、观察者等,我看到了很多奇怪的错误。所以请保持一个好习惯。

您的代码中存在一些问题:

  1. 您将 timer 声明为一个变量,您正在用 NSTimer() 填充它,下面的 2 行您正在覆盖该值。那么,为什么首先将 NSTimer 分配给 timer

  2. 如果您不使用 NSTimer.scheduledTimerWithTimeInterval(...) 返回的值,为什么要将其保存到 timer

  3. 最后,要将使用选择器的方法调用到不继承 NSObject 的 class 中,您应该使用 @objc.

    公开该方法
  4. #selector 的正确语法是 #selector(ClassName.methodName)

所以

class Foo {

    func foo() {
        let delay = 0.5
        NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(Foo.delayedHideTableView), userInfo: nil, repeats: false)
    }

    @objc func delayedHideTableView() {}
}