语境
我是学习 Swift 的初学者,我正在努力确保我理解这个错误“修复”。我跟着一个 Youtube 视频展示了如何在 Xcode 中创建一个计时器。我改变了一些东西以努力学习一些东西,但出现的问题来自原始代码。
错误
每次我启动模拟器时,如果我在没有先启动计时器的情况下按下停止或重置按钮,应用程序将崩溃并在同一行显示此错误timer.invalidate()
:
在隐式展开可选值时意外发现 nil
我的修复
为了解决我添加的问题?
,使其timer?.invalidate()
如下面的代码所示。我在谷歌搜索后尝试了这个,以便对正在发生的事情有一个非常松散的了解。
这是否有效,因为计时器尚不存在,因此它是“nil”?
这是防止崩溃的最佳方法吗?似乎我也可以将变量 timer 改为使用?
并让它工作,但只有在添加?
到 step 函数中的 timer.invalidate() 行以及其他行之后。显然,我需要重新了解我对 Optionals 的理解。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
var timeRemaining: Int = 10
var timer: Timer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func start(_ sender: Any) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(step), userInfo: nil, repeats: true)
}
@IBAction func stop(_ sender: Any) {
timer?.invalidate() //added ? to timer
}
@IBAction func reset(_ sender: Any) {
timer?.invalidate() //added ? to timer
timeRemaining = 10
label.text = "\(timeRemaining)"
}
@objc func step() {
if timeRemaining > 0 {
timeRemaining -= 1
} else {
timer.invalidate()
}
label.text = "\(timeRemaining)"
}
}