gpt4 book ai didi

swift - 符合通用协议(protocol)方法返回 PAT

转载 作者:搜寻专家 更新时间:2023-10-31 22:17:39 24 4
gpt4 key购买 nike

我想声明类似于以下的通用协议(protocol):

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.

最佳答案

这行不通。当您调用您的createWidget指定两种类型的方法TTWidget .

struct MyWidget: Widget { 
func get() -> Int { ... }
}

let widget: MyWidget = factory.createWidget(12)

在这个例子中 TWidgetMyWidgetTInt .这很好地说明了为什么您的方法行不通。您不能分配 ConcreteWidget<Int>MyWidget 类型的变量.

您需要的是用于您的小部件的类型橡皮擦。目前您必须自己编写,但将来编译器有望在需要时自动生成它们。

struct AnyWidget<T>: Widget {
private let _get: () -> T

init<Other: Widget>(_ other: Other) where Other.T == T {
_get = other.get
}

func get() -> T {
return _get()
}
}

这允许您编写工厂协议(protocol)和实现:

protocol Factory {
func createWidget<T>(_ t: T) -> AnyWidget<T>
}

struct ConcreteFactory: Factory {
func createWidget<T>(_ t: T) -> AnyWidget<T> {
return AnyWidget(ConcreteWidget(widgetValue: t))
}
}

关于swift - 符合通用协议(protocol)方法返回 PAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53601834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com