协议要求委托从UIViewController继承

时间:2018-09-19 09:32:50

标签: ios swift

我有一个看起来像这样的协议ShareDelegate

protocol ShareDelegate : class {
    func share(event: EventJSONModel, skipToTime time: CMTime?, view: UIView, completion: @escaping () -> ())
}

extension ShareDelegate where Self: UIViewController {
    func share(event: EventJSONModel, skipToTime time: CMTime? = nil, view: UIView, completion: @escaping () -> ()) {

    }
}

然后当我使用它作为委托时:

weak var delegate: ShareDelegate?

,然后调用委托函数:

delegate?.share(event: event, view: view, completion: completion)

它给我以下错误

'ShareDelegate' requires that 'ShareDelegate' inherit from 'UIViewController'

如果我删除扩展名的skipToTime time: CMTime?部分,它将正常工作。为什么?

2 个答案:

答案 0 :(得分:1)

extension ShareDelegate where Self: UIViewController {
    func share(...) {

    }
}

由于上面的这段代码,您需要一个UIViewController才能使用扩展名向委托人确认,看起来像这样

extension UIViewController: ShareDelegate {
    func share(...) {

    }
}

答案 1 :(得分:1)

问题在于协议和默认实现之间的接口不同。

协议:

func share(event: EventJSONModel, skipToTime time: CMTime?, view: UIView, completion: @escaping () -> ())

扩展名:

func share(event: EventJSONModel, skipToTime time: CMTime? = nil, view: UIView, completion: @escaping () -> ())

因此,您已经声明扩展中的skipToTime是可选的,具有默认值,因此在调用它并跳过该值时,您将专门调用限于UIViewController的版本

更新:

您应该能够限制ShareDelegate协议的使用,以便它只能与如下的UIViewControllers一起使用:

protocol ShareDelegate: class where Self: UIViewController {
    func share()
}