如何在Swift中使用计时器避免“变量被写入,但从未读过”警告

时间:2016-06-22 18:06:57

标签: swift timer warnings var

我正在使用此代码来延迟tableView的出现/消失。

    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

也许我的定时器变量有问题,怎么能避免这个错误?我知道我可以使用打印(计时器)声明,但我不认为这可以被视为最佳实践。

4 个答案:

答案 0 :(得分:4)

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

所以只需添加:

deinit {
  self.timer.invalidate()
}

在你班上。

我已经看到很多奇怪的错误,因为没有deinit计时器,观察者等。所以保持良好的习惯。

答案 1 :(得分:4)

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

  1. 您将timer声明为变量,您使用NSTimer()填充它,并且下面有2行覆盖该值。那么为什么首先将NSTimer分配给timer

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

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

  4. #selector的正确语法为#selector(ClassName.methodName)

  5. 所以

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

答案 2 :(得分:3)

不要创建timer变量,因为它不是必需的。就在下面做:

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

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

答案 3 :(得分:2)

在你的例子中,你根本不需要NSTimer的变量。所以你可以删除

var timer = NSTimer()

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

var timer:NSTimer

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

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

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

并且警告将消失。