簡體   English   中英

通用協議Swift 4錯誤

[英]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類型別名。

  1. 嘗試創建一個實現其協議的FactoryComponent具體類
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM