【发布时间】:2018-12-04 07:02:09
【问题描述】:
我想声明类似于以下的通用协议:
protocol Factory {
func createWidget<T, TWidget>(_ t: T) -> TWidget
where TWidget: Widget, TWidget.T == T
}
protocol Widget {
associatedtype T
func get() -> T
}
我希望我可以实现 Factory 的具体变体,通过隐藏的实现返回它们自己的具体和不透明的 Widget。
这是一个构建失败的示例实现:
struct ConcreteFactory: Factory {
func createWidget<T, TWidget>(_ t: T) -> TWidget
where TWidget: Widget, TWidget.T == T {
// This line has an error…
return ConcreteWidget(widgetValue: t)
}
}
struct ConcreteWidget<T>: Widget {
let widgetValue: T
init(widgetValue: T) {
self.widgetValue = widgetValue
}
func get() -> T {
return widgetValue
}
}
但是,这不会编译。
在指示的行中,Swift 的编译器给出了错误“无法将 'ConcreteWidget' 类型的返回表达式转换为 'TWidget' 类型的返回表达式”。
我也尝试让ConcreteFactory 返回ConcreteWidget,但错误是ConcreteFactory 不符合Factory。
【问题讨论】:
标签: swift generics swift-protocols pats