我有一个名为MessageType的associatedtype协议。

protocol MessageProtocol: class {
    associatedtype MessageType

    func sendMessage(_ with: MessageType)
}

然后在控制器中实现
extension MainController: MessageProtocol{

    typealias MessageType = String

    func sendMessage(_ with: MessageType) {
        // sending message
    }
}

我的目的是在下面这样的其他控制器中使用协议作为委托。
final class AnotherController {

    weak var messagerDelegate: MessageProtocol?

    ...
}

但我错了
协议“MessageProtocol”只能用作泛型约束
因为它有自己或相关的类型要求
有办法处理这个错误吗?
我在读一篇关于这种情况的博文。
https://www.bignerdranch.com/blog/why-associated-type-requirements-become-generic-constraints/
我已经了解了情况,但不知道如何才能做到这一点?
谢谢,

最佳答案

我这样处理情况。

final class AnotherController<T: MessageProtocol> where T.MessageType == String {

    weak var messagerDelegate: T?

    ...
}

如果我想以编程方式创建另一个控制器实例,我就这样创建了。
let instance = AnotherController<MainController>(frame: CGRect.zero)
instance.delegate = self
...

因为从
MainController
也许这不是常见的情况,但对我有效。

关于ios - 如何将通用(关联类型要求)协议(protocol)作为委托(delegate)委派给任何 Controller ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57837632/

10-15 03:02