【问题标题】:Performing a method that uses variables that come from optional执行使用来自可选变量的方法
【发布时间】:2015-08-06 12:14:02
【问题描述】:

如果我需要执行一个方法,其多个参数的原始来源是可选的,在执行该方法之前执行多个可选绑定是最干净的方法吗?

例如UIStoryboardSegue 的 sourceViewController 和 destionationViewController 都是 AnyObject?我需要使用源的 navigationController 来执行某些操作。

 override func perform() {
        var svc = self.sourceViewController as? UIViewController
        var dvc = self.destinationViewController as? UIViewController

        if let svc = svc, dvc = dvc {
            svc.navigationController?.pushViewController(dvc, animated: true)
        }
    }

【问题讨论】:

    标签: swift optional-binding


    【解决方案1】:

    如果视图控制器是 Interface Builder 中设计的 segue 的一部分,并且您实际上知道它们不是 nil,则可以解开它们

    override func perform() {
            var svc = self.sourceViewController as! UIViewController
            var dvc = self.destinationViewController as! UIViewController
    
            svc.navigationController!.pushViewController(dvc, animated: true)
        }
    

    否则如果源控制器可以为nil,只有控制器不为nil时才会执行push命令,就像在Objective-C中向nil发送消息

    override func perform() {
            var svc = self.sourceViewController as? UIViewController
            var dvc = self.destinationViewController as? UIViewController
    
            svc.navigationController?.pushViewController(dvc, animated: true)
        }
    

    【讨论】:

    • 由于 segue 只能在故事板中存在,因此强制展开应该永远不会失败,对吧?
    • 是的,segues 也可以在代码中创建,但在 Interface Builder 中它们是安全的。
    【解决方案2】:

    似乎没有必要创建两个变量,如果你真的想确保可选值不是 nil,你可以使用:

    override func perform() {
        if let svc = self.sourceViewController as? UIViewController, 
               dvc = self.destinationViewController as? UIViewController {
            svc.navigationController?.pushViewController(dvc, animated: true)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      相关资源
      最近更新 更多