0

If I need to perform a method whose multiple parameters' original source are optional, is doing multiple optional binding before performing the method the cleanest way to go about this?

e.g. UIStoryboardSegue's sourceViewController and destionationViewController are both AnyObject? and I need to use source's navigationController to perform something.

 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)
        }
    }
4

2 に答える 2

0

オプションの値が使用できる nil でないことを本当に確認したい場合は、2 つの変数を作成する必要はないようです。

override func perform() {
    if let svc = self.sourceViewController as? UIViewController, 
           dvc = self.destinationViewController as? UIViewController {
        svc.navigationController?.pushViewController(dvc, animated: true)
    }
}
于 2015-08-06T12:25:10.497 に答える
0

View Controller が Interface Builder で設計されたセグエの一部であり、それらが nil ではないことが実際にわかっている場合は、ラップを解除できます。

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

        svc.navigationController!.pushViewController(dvc, animated: true)
    }

それ以外の場合、ソースコントローラーが nil の可能性がある場合、コントローラーが nil でない場合にのみプッシュコマンドが実行されます。これはnil、Objective-C でメッセージを送信するようなものです。

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

        svc.navigationController?.pushViewController(dvc, animated: true)
    }
于 2015-08-06T12:22:08.043 に答える