如果基类有多种可能性,建议使用'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()
}
答案 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块中的类型是什么类型?它可以是A1ViewController
或A1ViewController
,具体取决于委托在运行时的内容。因此无法编译,因为委托在编译时需要静态类型。我建议你做一下Alessandro用switch语句建议的东西,或者创建一个抽象两种类型的协议。