【发布时间】:2020-01-10 06:05:31
【问题描述】:
我有一个具有名为 MessageType 的关联类型的协议。
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?
...
}
但我得到了那个错误
Protocol 'MessageProtocol' 只能用作通用约束 因为它有 Self 或关联的类型要求
有没有办法处理这个错误?
我正在阅读关于这种情况的 Big Nerd Ranch 博客文章。 https://www.bignerdranch.com/blog/why-associated-type-requirements-become-generic-constraints/
我了解了这种情况,但不知道如何实现?
谢谢,
【问题讨论】:
-
没有灵丹妙药。我建议你阅读robnapier.net/start-with-a-protocol
-
@Alexander 谢谢,我正在阅读。
-
@ThanhVu 我阅读了问题和答案,但不知道如何申请自己。顺便可以标记为重复。
-
嘿,@RobNapier,在 sendMessage 函数中只有 print 函数可以打印值。
AnotherController调用委托,因为它使用 MessageProtocol 舒适的MainController类型生成。这太荒谬了,我知道。还有AnotherController因为T.MessageType == String而知道MessageType。我觉得simple和non-generic的功能一定更好。