以下代码曾经在 Swift 3.2 上为我工作,但在最新版本的 Swift 4 中,我遇到了一个我无法理解的奇怪错误。
我正在尝试创建一个像这样的通用协议(protocol):
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 重大更改,没有看到任何涉及通用协议(protocol)的内容。
有人可以帮我理解这是什么意思吗?
最佳答案
似乎缺少FactoryComponent
的具体类。 Factory
类型别名只能由协议(protocol)的具体类调用。
- 尝试创建一个实现其协议(protocol)的
FactoryComponent
具体类 Argument
和Service
在您的实现中仍然是通用的,并且需要具体类型。我的英语很差,但我希望我能帮助你。如果我的答案不清楚,请检查下面的代码。
```
class Resolver {}
protocol FactoryComponent {
associatedtype Argument
associatedtype Service
static var factory: (Resolver) -> (Argument) -> Service { get }
}
extension FactoryComponent {
typealias Factory = (Argument) -> Service
}
class ConcreteFactoryComponent: FactoryComponent {
static var factory: (Resolver) -> Factory {
return foo
}
static func foo(_ resolver: Resolver) -> Factory {
let factory: Factory = { argument in return "" }
return factory
}
typealias Argument = String
typealias Service = String
}
let factory: ConcreteFactoryComponent.Factory = { argument in return "" }
```
关于ios - 通用协议(protocol) Swift 4 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674824/