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

时间:2018-01-01 08:23:49

标签: swift protocols solid-principles associated-types

我创建了一个协议

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())

但我的错误是

  

协议&#39; DataBaseManager&#39;只能用作通用约束   因为它有自我或相关的类型要求

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

1 个答案:

答案 0 :(得分:0)

尝试为LoginViewModel结构提供泛型类型参数,并使用它来代替:

struct LoginViewModel<DBM: DataBaseManager> {

    var dbManager: DBM

    init(dbManager: DBM) {
        self.dbManager = dbManager
    }
}