【发布时间】:2020-04-16 17:29:30
【问题描述】:
我有一个责任链模式的经典实现,代码如下:
protocol Request {
var firstName: String? { get }
var lastName: String? { get }
var email: String? { get }
var password: String? { get }
var repeatedPassword: String? { get }
}
protocol Handler {
var next: Handler? { get }
func handle(_ request: Request) -> LocalizedError?
}
class BaseHandler: Handler {
var next: Handler?
init(with handler: Handler? = nil) {
self.next = handler
}
func handle(_ request: Request) -> LocalizedError? {
return next?.handle(request)
}
}
所以我可以创建一个 PermissionHandler、LocationHandler、LoginHandler、一个 SignupHandler 并将它们组合成链。到目前为止一切顺利。
现在我想为其他目的创建一个责任链,比方说具有不同类型 MediaContentHandler 的 MediaContentPlayer CoR,我想使用泛型重构和重用基本代码。
所以我从Handler协议开始:
protocol Handler {
associatedtype HandlerRequest
var next: Handler? { get }
func handle(_ request: HandlerRequest) -> LocalizedError?
}
但我收到错误“协议‘处理程序’只能用作通用约束,因为它具有自身或关联的类型要求”。
在使用关联类型时,有没有办法在协议本身内部引用协议?或者另一种方式使上述代码不依赖于特定类型?
【问题讨论】:
标签: swift generics design-patterns protocols associated-types