我想制作一些具有通用类型的抽象协议
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
}
}