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

时间:2017-09-06 15:44:51

标签: ios swift uiviewcontroller optional

我注意到iOS代码中存在令人讨厌的模式。在实例化新的视图控制器之后,视图控制器从先前的视图控制器传递参数,因此您最终得到的代码如下例所示。 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!并希望在设置之前不会调用任何内容。
  3. 所以也许我的问题归结为:在这里做#2是否安全?是否保证在第一个控制器中UIViewController之前prepare(for:sender:)上没有调用任何内容?

    编辑:我不喜欢选项1的一个原因是它几乎在所有方法中都会导致guards,这可能是不必要的。好像给我一个代码味道。在纯粹的Swift课程中,您可以将thingabc传递给init(...),并且它们不是可选的,但您无法在此处执行此操作。我们正处理一个奇怪的情况,其中Swift被添加到Objective C中设计的东西。

1 个答案:

答案 0 :(得分:0)

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