如果第一个失败,可选择向下转换为另一种类型

Optional downcasting to another type if the first one fails

我有一个 class 和 UIViewController

类型的代表

此委托可以是 UIViewController 的 2 个子class之一。两个 subclasses 都包含一个具有相同参数的同名方法。

class TypeOne: UIViewController {
    method() {

    }
}

class TypeTwo: UIViewController {
    method() {

    }
}

目前我正在写这样的声明,当然它有效,但从 DRY 的角度来看它让我发疯。

if let delegate = delegate as? TypeOne {
    delegate.method()
} else if let delegate = delegate as? TypeTwo {
    delegate.method()
}

我想做类似的事情

if let delegate = delegate as? TypeOne ?? delegate as TypeTwo {
    delegate.method()
}

但是上面的内容实际上并没有向下转换委托,因为我得到一个错误,类型 UIViewController 不包含 'method'

如果第一个向下转换失败,我还可以如何链接它,然后尝试第二个并且委托被视为任一类型而不是基础 UIViewController?

您正在描述一个协议:

protocol MethodHolder {
    func method()
}
class TypeOne: UIViewController, MethodHolder {
    func method() {
    }
}
class TypeTwo: UIViewController, MethodHolder {
    func method() {
    }
}
class ActualViewController : UIViewController {
    var delegate : MethodHolder?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate?.method() // no need to cast anything!
    }
}

不需要转换任何东西,因为将委托键入为 MethodHolder 可以向编译器(和您)保证此对象具有 method 方法。因此,您可以调用该方法而不必费心去了解它是 TypeOne 还是 TypeTwo。