使用泛型类型时如何使用默认参数扩展Swift协议?

问题描述 投票:0回答:1

我有一个类似的协议

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

swift default-value swift-protocols
1个回答
0
投票

有什么方法可以指定默认情况下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) } }

© www.soinside.com 2019 - 2024. All rights reserved.