下面的代码用于我在SWIFT3.2中工作,但是随着Swift 4的最新发布,我得到了一个奇怪的错误,我无法理解。
我正在尝试创建一个类似这样的通用协议:
public protocol FactoryComponent {
associatedtype Argument
associatedtype Service
static var factory: (Resolver) -> (Argument) -> Service { get }
}
public extension FactoryComponent {
public typealias Factory = (Argument) -> Service
}在这里使用它:
public extension Container {
@discardableResult
public func register<Component: FactoryComponent>(
factory componentType: Component.Type
) -> ServiceEntry<Component.Factory> { // On this line the error shows
return self.register(componentType.Factory.self) { resolver in
componentType.factory(resolver)
}
}
}错误:
'Component‘没有一个名为“Factory”的成员类型;您的意思是“工厂”吗?
当然,自动修复没有帮助,因为错误是无用的.
我查看了Swift 4的破坏更改,没有看到任何涉及通用协议的内容。
有人能帮我理解一下这是什么意思吗?
发布于 2017-10-10 20:35:20
似乎缺少一个具体的FactoryComponent类。Factory类型别名只能由协议的具体类调用。
FactoryComponent具体类Argument和Service在您的实现上仍然是通用的,需要一个具体的类型。我的英语很差,但我希望我一直在帮助你。如果我的答案不清楚,请检查下面的代码。```javascript类解析器{}
协议FactoryComponent {
关联类型参数
关联类型服务
静态变量工厂:(Resolver) -> (参数) ->服务{ get }
}
扩展FactoryComponent {
类型工厂=(参数) ->服务
}
类ConcreteFactoryComponent: FactoryComponent {
静态变量工厂:(Resolver) ->工厂{
return foo}
静态函数foo(_解析器: Resolver) ->工厂{
let factory: Factory = { argument in return "" }return factory}
类型参数=字符串
类型服务=字符串
}
设工厂: ConcreteFactoryComponent.Factory ={参数返回"“}
发布于 2017-10-10 20:41:58
我相信错误并不是真正与返回类型有关。由于@转义的新默认值,Swift 4中通用签名解析的处理略有改变。函数调用具有与函数本身相同签名的self.register函数的事实很可能是问题的根源。
从其他类似的例子中,我建议查看Container.register的签名。如果它碰巧有一个@转义闭包,那么扩展中的泛型函数的签名也应该有一个,以便将它识别为重载。
见本文:https://stackoverflow.com/a/43081214/5237560
编辑:我刚刚意识到这个变化是在Swift 2和3之间,如果它能提供一些灵感,就把答案留在这里。
https://stackoverflow.com/questions/46674824
复制相似问题