如何在 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 计时器、观察者等,我看到了很多奇怪的错误。所以请保持一个好习惯。
您的代码中存在一些问题:
您将 timer
声明为一个变量,您正在用 NSTimer()
填充它,下面的 2 行您正在覆盖该值。那么,为什么首先将 NSTimer
分配给 timer
?
如果您不使用 NSTimer.scheduledTimerWithTimeInterval(...)
返回的值,为什么要将其保存到 timer
?
最后,要将使用选择器的方法调用到不继承 NSObject
的 class 中,您应该使用 @objc
.
公开该方法
#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() {}
}
我正在使用此代码来延迟 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 计时器、观察者等,我看到了很多奇怪的错误。所以请保持一个好习惯。
您的代码中存在一些问题:
您将
timer
声明为一个变量,您正在用NSTimer()
填充它,下面的 2 行您正在覆盖该值。那么,为什么首先将NSTimer
分配给timer
?如果您不使用
NSTimer.scheduledTimerWithTimeInterval(...)
返回的值,为什么要将其保存到timer
?最后,要将使用选择器的方法调用到不继承
公开该方法NSObject
的 class 中,您应该使用@objc
.#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() {}
}