[英]Use Generic Protocol as Interface
我想使用通用协议创建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案例只接受一对泛型? (即:Void / [Product])?
是的,但您的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
无法逃避。 它可能需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.