繁体   English   中英

使用 swinject 注册具有关联类型的协议时出现问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM