如何在强约束条件下进行协议继承



我想制作一些具有通用类型的抽象协议

protocol UseCase {
associatedtype P
associatedtype R
func execute(params: P) async throws -> R
}

然后我想用一些类型的制作一些具体的协议

protocol TestUseCase: UseCase where P == Int, R == Int { }

然后使用它来声明一些实现,以便在另一侧上使用它

class TestUseCaseImpl: TestUseCase {
func execute(params: Int) async throws -> Int {
// some impl
}
}

当我试图在我的视图模型中使用它时,我得到了这样的错误:

class ViewModel {
private let testUseCase: TestUseCase // error
init(testUseCase: TestUseCase) { // errror
self.testUseCase = testUseCase
}
}
Protocol 'TestUseCase' can only be used as a generic constraint because it has Self or associated type requirements

为了解决这样的问题,我可以用一些用例类型声明泛型ViewModel,如下所示:

class ViewModel<UseCase: TestUseCase> {
private let testUseCase: UseCase
init(testUseCase: UseCase) {
self.testUseCase = testUseCase
}
}

关于ViewModel的问题-ViewModel内部可能有许多用例。如何在没有通用ViewModel的情况下实现这样的想法?

您需要使用any关键字。这仅在Swift>=中支持5.7.

注意:您不太可能想要一个名为ViewModel的类型。在View中嵌套类型Model(如果是这样的话(。

class ViewModel {
private let testUseCase: any TestUseCase
init(testUseCase: some TestUseCase) {
self.testUseCase = testUseCase
}
}

最新更新