使用泛型类型时如何使用默认参数扩展 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 = { [=12=] }, // 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: { [=10=] }, completionHandler: completionHandler)
}
}
我有一个类似
的协议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 = { [=12=] }, // 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: { [=10=] }, completionHandler: completionHandler)
}
}