如何注入相关类型的协议?

问题描述 投票:0回答:1

我创建了一个协议

protocol DataBaseManager{
    associatedtype type
    init()
    func insert(object obj: [type])
    func getObject(ofType type: type.Type)-> Array<type>
    //...

}

现在我已经将RealmManager定义为

class RealmManager: DataBaseManager{

    var realm:Realm!

    required init() {
        do{
            realm =  try Realm()
        }catch {
            print(error)
        }
    }

    func insert(object obj: [Object]) {
        do {
            try realm.write {
                realm.add(obj)
            }
        } catch let error {
            print("the error in creation of object is \(error)")
        }
    }

    func getObject(ofType type: Object.Type)-> Array<Object> {
        let objects = realm.objects(type)
        return Array(objects)
    }
    //.....
}

这样做的关键是如果有必要,稍后在To SqliteManager上替换数据库。为此我将我的viewModel中的依赖项发送为:

  struct LoginViewModel {

    var dbManager:DataBaseManager //error in this line
    init(dbManager: DataBaseManager) {
        //.....
        self.dbManager = dbManager
    }
}

并称之为

let loginViewModel = LoginViewModel(dbManager:RealmManager())

但我得到的错误是

协议'DataBaseManager'只能用作通用约束,因为它具有Self或关联类型要求

由于swift不支持使用相关类型注入协议。什么可能是解决这个问题的可能的调整?

swift protocols solid-principles associated-types
1个回答
0
投票

尝试为LoginViewModel结构提供泛型类型参数,然后使用它:

struct LoginViewModel<DBM: DataBaseManager> {

    var dbManager: DBM

    init(dbManager: DBM) {
        self.dbManager = dbManager
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.