Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用通用协议作为接口_Ios_Swift - Fatal编程技术网

Ios 使用通用协议作为接口

Ios 使用通用协议作为接口,ios,swift,Ios,Swift,我想使用通用协议创建一个UseCase协议。然后我想为所有实现创建一个接口,以便为测试创建模拟 以下是我迄今为止所做的工作: struct Product {} protocol UseCase { associatedtype ReturnType associatedtype Param func execute(_ params: Param, completion: ((ReturnType) -> Void)) } protocol FetchPro

我想使用通用协议创建一个
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用例只接受一对泛型?(即:无效/[产品])

是的,但是您的
fetchProductsCase
不是您的操作方式。改为这样做:

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())