[英]Problem registering protocols with associated types using swinject
我想开发一个使用核心数据和 realm 的存储库模式的应用程序。 我想根据我的需要解决协议。 目的是在程序集中注入一个通用核心数据存储库/realm 存储库协议。
此行出现问题,说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 或关联的类型要求”并且我不知道如何解决我的 SleepRepositoryProtocol。
这个错误很经典:
container.register(SleepRepositoryProtocol.self) { r in
被禁止,因为SleepRepositoryProtocol
是具有关联类型的协议。
您需要的是assemble(container:)
方法是通用的并以这种方式声明,例如:
func assemble<Repository: SleepRepositoryProtocol>(container: Container, ofType type:Repository) {
但由于它是Swinject 的 Assembly Protocol的一部分,因此它不是一个选项,您需要找到另一个放置Generic Type Constraint的地方。
在您的情况下,它可以是封闭类型,例如:
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)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.