如果第一个失败,可选择向下转换为另一种类型
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。
我有一个 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。