斯威夫特:使用警卫或声明

时间:2016-07-22 13:22:15

标签: swift

如果基类有多种可能性,建议使用'as'与'if'结合使用的方法,例如

var delegate:AnyObject?

func myFunction(){

if let delegate = self.delegate as? A1ViewController {
  delegate.callFunction()
}

if let delegate = self.delegate as? A2ViewController{
   delegate.callFunction()
}
}

有没有办法合并上面的两个if语句?

e.g。

if let delegate = self.delegate as? A1ViewController || let delegate = self.delegate = self.delegate as? A2ViewController {
   delegate.callFunction()
}

3 个答案:

答案 0 :(得分:4)

无论你想达到什么目的(在我看来你的代码设计中存在一些问题,如果你需要这个),这是我为这种检查编写最干净的代码的2美分。

您目前无法发出两个let ... = ...语句。无论如何,您可以解决创建包含公共调用,扩展类和使用单个代码路径的公共协议的问题。

protocol CommonDelegateProtocol { 
    func callFunction()
}

extension A1ViewController : CommonDelegateProtocol {}
extension A2ViewController : CommonDelegateProtocol {}

// then...

if let delegate = self.delegate as? CommonDelegateProtocol {
   delegate.callFunction()
}

带有交换机的版本,如果代码路径不同。

如果您需要不同的代码路径,这是我最好的选择。通过这种方式,您还可以强制您的代码评估所有可能的情况。

switch self.delegate {
case let d as A1ViewController:
    // "d" is of type A1ViewController
    d.callA1Function()
case let d as A2ViewController:
    // "d" is of type A2ViewController
    d.callA2Function()
default:
    print("Uncovered case")
}

答案 1 :(得分:0)

如果您只有两个选项并确保至少有一个选项不为null,那么将其作为单行的一种方法是使用三元运算符:

delegate = self.delegage as? A1ViewController != null ? self.delegage as? A1ViewController : self.delegage as? A2ViewController

答案 2 :(得分:0)

亚历山德罗上面的回答是你最接近你要做的事情。你不能在if let绑定中组合这两个语句的原因是你试图绑定到两个不同的类。您期望delegate在if-let块中的类型是什么类型?它可以是A1ViewControllerA1ViewController,具体取决于委托在运行时的内容。因此无法编译,因为委托在编译时需要静态类型。我建议你做一下Alessandro用switch语句建议的东西,或者创建一个抽象两种类型的协议。