簡體   English   中英

使用泛型類型時,如何使用默認參數擴展 Swift 協議?

[英]How can I extend a Swift protocol with a default parameter when using generic types?

我有一個類似的協議

protocol QueryProtocol {
  associatedtype Data
}

protocol DataFetcher {
  func fetch<Query: QueryProtocol, Output>(
    query: Query,
    parser: (Query.Data) -> Output,
    completionHandler: (Output) -> Void
  )
}

我想擴展協議並為解析器提供一個默認值作為身份。 所以我試過了

extension DataFetcher {
  func fetch<Query: QueryProtocol, Output>(
    query: Query,
    parser: (Query.Data) -> Output = { $0 }, // Cannot convert value of type 'Query.Data' to closure result type 'Output'
    completionHandler: (Output) -> Void
  ) {
    fetch(query: query, parser: parser, completionHandler: completionHandler)
  }
}

但編譯器失敗, Cannot convert value of type 'Query.Data' to closure result type 'Output'

有什么方法可以指定默認情況下Query.Data = Output

有什么方法可以指定默認情況下Query.Data = Output

不。

但是,您可以定義僅適用於Query.Data = Output的重載:

extension DataFetcher {
    func fetch<Query: QueryProtocol, Output>(
        query: Query,
        completionHandler: (Output) -> Void
    )
        where Query.Data == Output
    {
        fetch(query: query, parser: { $0 }, completionHandler: completionHandler)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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