gpt4 book ai didi

swift - 如何注入(inject)关联类型的协议(protocol)?

转载 作者:行者123 更新时间:2023-11-30 11:53:51 33 4
gpt4 key购买 nike

我创建了一个协议(protocol)

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)
}
//.....
}

这样做的全部目的是在必要时轻松替换数据库到 SqliteManager。为此,我将 viewModel 中的依赖项发送为:

  struct LoginViewModel {

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

并将其称为

let loginViewModel = LoginViewModel(dbManager:RealmManager())

但是我收到错误

Protocol 'DataBaseManager' can only be used as a generic constraint because it has Self or associated type requirements

因为 swift 不支持注入(inject)关联类型的协议(protocol)。有什么可能的调整来解决这个问题?

最佳答案

尝试为 LoginViewModel 结构提供通用类型参数并使用它:

struct LoginViewModel<DBM: DataBaseManager> {

var dbManager: DBM

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

关于swift - 如何注入(inject)关联类型的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48048190/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com