gpt4 book ai didi

ios - 如何避免 Swift UIViewControllers 中的可选检查?

转载 作者:行者123 更新时间:2023-11-28 08:02:57 25 4
gpt4 key购买 nike

我注意到 iOS 代码中有一个烦人的模式。在实例化新的 View Controller 之后, View Controller 从以前的 View Controller 传递参数,因此您最终会得到如下示例的代码。 SecondViewController 的属性实际上不是可选的,但它们必须可以为空,因为您在 prepare(for:sender:) 中设置了它们。

class FirstController : UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
...
let vc = segue.destination as! SecondController
vc.thing = getThing()
vc.abc = "123"
...

class SecondController : UIViewController {
var thing: Thing?
var abc: String?
override func viewDidLoad() { ... }
func foo() {
guard let thing = self.thing else { return }
...
}
func bar() {
blahBlah(abc!)

实例变量似乎有两个选项...

  1. 让它们成为 T? 并且到处都有 guardif let
  2. 让它们成为 T! 并希望在它们被设置之前不会调用任何东西。

所以也许我的问题可以归结为:在这里执行#2 是否安全?是否可以保证在第一个 Controller 中的 prepare(for:sender:) 之前没有对 UIViewController 调用任何内容?

编辑:我不太喜欢选项 1 的一个原因是它在几乎所有方法中都会导致 guards,而它们可能是不必要的。对我来说似乎是代码的味道。在纯 Swift 类中,您会将 thingabc 传递给 init(...),它们是非可选的,但是你不能在这里这样做。我们正在处理一个奇怪的情况,即 Swift 被添加到用 Objective C 设计的东西中。

最佳答案

从理论上讲,是的,如果您在准备之前设置所有这些变量,那么应该没问题。但是到处使用 guard 和 let 有什么问题呢?这就是 swift 的方式。即使现在做 2 号是安全的,谁又能说将来不安全呢?或者发生了一些我们不知道的奇怪行为,它实际上并不安全,或者你也有其他人在这个项目上工作,但他们不知道这一点,忘记在继续之前设置一个变量,然后结束导致崩溃。因此,1 号是迄今为止最安全的路线,您可以放心地休息,因为它不会因此而崩溃。

关于ios - 如何避免 Swift UIViewControllers 中的可选检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46079435/

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