0

我有一个类型的代表类UIViewController

这个委托可以是 UIViewController 的 2 个子类之一。两个子类都包含一个具有相同名称且参数相同的方法。

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 类型不包含“方法”

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

4

1 回答 1

2

您正在描述一个协议:

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。

于 2020-01-03T02:31:51.880 回答