我创建了一个协议
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不支持使用关联类型注入协议。什么可能是解决这个问题的可能的调整?
答案 0 :(得分:0)
尝试为LoginViewModel结构提供泛型类型参数,并使用它来代替:
struct LoginViewModel<DBM: DataBaseManager> {
var dbManager: DBM
init(dbManager: DBM) {
self.dbManager = dbManager
}
}