ios - 使用通用协议作为接口
问题描述
我想创建一个UseCase
协议,使用通用协议。然后我想为所有实现创建一个接口,以便为测试创建模拟。
这是我到目前为止所做的:
struct Product {}
protocol UseCase {
associatedtype ReturnType
associatedtype Param
func execute(_ params: Param, completion: ((ReturnType) -> Void))
}
protocol FetchProductsUseCase: UseCase {
associatedtype ReturnType = [Product]
associatedtype Param = Void
}
struct FetchProductsUseCaseImpl: FetchProductsUseCase {
func execute(_ params: Param , completion: ((ReturnType) -> Void)) {
completion([])
}
}
//ERROR: Protocol 'FetchProductsUseCase' can only be used as a generic constraint because it has Self or associated type requirements
var useCase: FetchProductsUseCase!
有人可以帮我解决这个问题吗?
我搜索了 SOF,发现了多个关于泛型的主题,但没有一个对我的案例有帮助。
解决方案
所以没有办法“限制” FetchProductUse 案例只接受一对 Generics ?(即:无效/[产品])?
是的,但你FetchProductsUseCase
不是你的做法。改为这样做:
struct AnyUseCase<P, R>: UseCase {
typealias ReturnType = R
typealias Param = P
init<U>(useCase: U) where U: UseCase, U.ReturnType == ReturnType, U.Param == Param {
_execute = useCase.execute
}
func execute(_ params: P, completion: ((R) -> Void)) {
_execute(params, completion)
}
let _execute: (P, (R) -> Void) -> Void
}
var useCase: AnyUseCase<Void, [Product]>!
然后您可以执行以下操作:
useCase = AnyUseCase(useCase: FetchProductsUseCaseImpl())
我认为你的下一个错误将completion
是没有逃避。它可能需要。
推荐阅读
- can-bus - candump如何显示发送、接收和时间戳
- c++ - 将已经存在的 cudaTextureObject 绑定到 OpenSceneGraph(OpenGL) 中的纹理以进行渲染
- java - 如何在 Java 中使用搜索和替换自定义 HTML 标签?
- sql-server - SQL Server,在单个查询中显示来自多个表的总量
- angular - 如何从 Angular 6 中的 HttpClient 请求中获取实时数据
- javascript - 跟踪下载,包括自定义尺寸
- objective-c - UILabel 不能在 Objective C 中扩展行号
- unix - 检查日志并根据收到的计数中止作业
- android - 当数据大于 1mb 时 api 的响应给出错误
- amazon-web-services - 用于调用 AWS SageMaker 对象检测模型的数据格式