gpt4 book ai didi

ios - 以 associatedtype 作为参数类型的 Swift 协议(protocol)

转载 作者:行者123 更新时间:2023-11-28 06:06:41 24 4
gpt4 key购买 nike

所以这里我有这个协议(protocol)

public protocol UseCase {

associatedtype ResponseType
associatedtype Parameters

func build(params: Parameters) -> Single<ResponseType>

}

public extension UseCase {

func execute(params: Parameters) -> Single<ResponseType> {
return build(params: params)
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: DispatchQoS.background))
.observeOn(MainScheduler.instance)
}

}

我有一个像这样实现 UseCase 协议(protocol)的结构

public struct CreateNewAccount: UseCase {

private let repository: AuthRepository

public init(repository: AuthRepository) {
self.repository = repository
}

public func build(params: Params) -> Single<User> {
return repository.register(params: params)
}

public struct Params: RequestParams {
...
}
}

我想在另一个类上使用这个 CreateNewAccount,但我不想直接使用 CreateNewAccount,我想将它作为 UseCase 传递 相反,因为它是一个协议(protocol),所以可以很容易地模拟它进行测试。但是当我做这样的事情时

class RegisterViewModel: ViewModel {

private let createNewAccount: UseCase // Error on this line

init(createNewAccount: UseCase) { // Error on this line
self.createNewAccount = createNewAccount
}
}

这给了我这样的错误

Error:(34, 35) protocol 'UseCase' can only be used as a generic constraint because it has Self or associated type requirements

那么,有什么我可以从我的代码中更改来使这种情况有效吗?提前致谢。

最佳答案

您不能将具有关联类型的协议(protocol)用作字段。

您只能将它们用作类的实现。在大多数情况下,这些类应该是通用的。

例如,此代码是允许的:

public struct CreateNewAccount<T, K>: UseCase {
public typealias ResponseType = T
public typealias Parameters = K
}

等等,

private let createNewAccount: CreateNewAccount<YouClass1,YouClass2>

或者用另一种协议(protocol)以某种方式包装它。

关于ios - 以 associatedtype 作为参数类型的 Swift 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47978762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com