繁体   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