Я хотел бы объявить общие протоколы, подобные следующим:
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
вернуть a ConcreteWidget
, но тогда ошибка в том, что ConcreteFactory
не соответствует Factory
.