我想开发一个使用核心数据和领域的存储库模式的应用程序。我想根据我的需要解决协议。目的是在程序集中注入通用核心数据存储库/领域存储库协议。
这行出现问题,表示Protocol 'SleepRepositoryProtocol' can only be used as a generic constraint because it has Self or associated type requirements
func assemble(container: Container) {
container.register(SleepRepositoryProtocol.self) { r in
CoreDataSleepRepository(persistentContainer:r.resolve(NSPersistentContainer.self)!)
}.inObjectScope(.container)
}
由于使用通用(关联类型(属性,我无法注入睡眠存储库协议。我该如何解决这个问题?
此外,非常感谢您的回复。这真的帮了我很多。我对此还有一个问题。
var存储库:SleepRepositoryProtocol
var items: [SleepEntity]?
private let assembler: Assembler
init(assembler: Assembler) {
self.assembler = assembler
repository = assembler.resolver.resolve(SleepRepositoryProtocol.self)!
}
这给了我错误";协议"SleepRepositoryProtocol"只能用作通用约束,因为它具有Self或相关类型要求";我不知道如何解决我的睡眠存储协议。
这个错误是典型的:
container.register(SleepRepositoryProtocol.self) { r in
被禁止,因为CCD_ 2是具有关联类型的协议。
您需要的是assemble(container:)
方法是通用的,并以这种方式声明,例如:
func assemble<Repository: SleepRepositoryProtocol>(container: Container, ofType type:Repository) {
但由于它是Swinject的Assembly Protocol的一部分,所以它不是一个选项,您需要找到另一个地方来放置泛型类型约束。
在您的情况下,它可以是封闭类型,例如:
class MyClass<Repository: SleepRepositoryProtocol>: Assembly {
func assemble(container: Container) {
container.register(Repository.self) { r in
CoreDataSleepRepository(persistentContainer:r.resolve(NSPersistentContainer.self)!)
}
.inObjectScope(.container)
}
}
编辑
你不能只写:
var repository: SleepRepositoryProtocol
一旦在协议中添加了associatedtype
,就可以永远不要像普通类型一样使用它,只能将其用作泛型类型约束
所以,如果我用你的其他属性更新MyClass
:
class MyClass<Repository: SleepRepositoryProtocol>: Assembly {
var repository: Repository
var items: [SleepEntity]?
private let assembler: Assembler
init(assembler: Assembler) {
self.assembler = assembler
repository = assembler.resolver.resolve(Repository.self)!
}
func assemble(container: Container) {
container.register(Repository.self) { r in
CoreDataSleepRepository(persistentContainer:r.resolve(NSPersistentContainer.self)!)
}
.inObjectScope(.container)
}
}