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

标签 ios swift uiviewcontroller option-type

我注意到 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/

相关文章:

ios - 具有自定义 UITextView 单元格的 TableView 将导航栏滚动到屏幕外

ios - 相机照片选择在 Swift 中不起作用

iphone - UIWindow subview 在应用程序变为事件状态后消失

ios - UIViewController 的 navigationController 属性

ios - 如何在我当前的 UIViewController 之上呈现一个 UIViewController?

ios - 关于iOS弹出窗口,要求用户继续允许应用在后台使用位置

ios - SceneKit 中的 "simd"前缀是什么意思?

ios - 当我将范围切换到月份时,FSCalendar 内容被压缩

ios - 两个按钮的背景颜色都改变了

swift - 如何更改游戏中的键盘重复率?