[英]Generic protocol Swift 4 error
以下代碼在Swift 3.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)
}
}
}
錯誤:
“組件”沒有名為“工廠”的成員類型; 你是說“工廠”嗎?
當然,自動修復也無濟於事,因為該錯誤是無用的...
我檢查了Swift 4的重大更改,沒有看到涉及通用協議的任何內容。
somone可以幫助我了解這是什么意思嗎?
似乎缺少FactoryComponent
的具體類。 只有協議的具體類才能調用Factory
類型別名。
FactoryComponent
具體類 Argument
and 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 "" }
```
我相信錯誤不是真正與返回類型有關。 由於@escaping的新默認設置,在Swift 4中,通用簽名解析的處理略有變化。 該函數正在調用具有與該函數本身相同的簽名的self.register函數的事實很可能是問題的根源。
從其他類似的實例中,我建議查看Container.register的簽名。 如果碰巧有一個@escaping閉包,那么擴展中的泛型函數的簽名也應該有一個,以便將其識別為重載。
看到這個帖子: https : //stackoverflow.com/a/43081214/5237560
[編輯]我剛剛意識到此更改是在Swift 2和3之間進行的。如果可以提供一些啟發,請在此處留下答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.