gpt4 book ai didi

ios - 防止这种与 Optional 相关的崩溃的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 07:43:06 34 4
gpt4 key购买 nike

上下文
我是学习 Swift 的初学者,我正在努力确保我理解这个错误“修复”。我跟着一个 Youtube 视频展示了如何在 Xcode 中创建一个计时器。我改变了一些东西以努力学习一些东西,但出现的问题来自原始代码。
错误
每次我启动模拟器时,如果我在没有先启动计时器的情况下按下停止或重置按钮,应用程序将崩溃并在与 timer.invalidate() 相同的行显示此错误:

Unexpectedly found nil while implicitly unwrapping an Optional value


我的修复
为了解决这个问题,我添加了 ?让它 timer?.invalidate()如下面的代码所示。我在谷歌搜索后尝试了这个,以便对正在发生的事情有一个非常松散的了解。
这是否有效,因为计时器尚不存在,因此它是“nil”?
这是防止崩溃的最佳方法吗?看来我也可以更改变量计时器以使用 ?而是让它工作,但只有在添加 ? 之后到 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)"
}


}

最佳答案

var timer: Timer!
意味着你告诉编译器 确定 timer永远不会是 nil ,因此,如果您尝试使用该变量并且它为 nil,您就会崩溃。这可能是发生在您身上的事情:调用 reset(_:)stop(_:)start(_:) 之前.
timer?.invalidate() //added ? to timer
修复崩溃,因为现在您正在访问 timer通过 optional chaining .
但它并没有解决无处不在的潜在问题,因此声明:
var timer: Timer?
更安全

关于ios - 防止这种与 Optional 相关的崩溃的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67349255/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com