Как ввести протокол со связанными типами?

Я создал протокол как

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

Но я получаю сообщение об ошибке, так как

Протокол DataBaseManager можно использовать только в качестве общего ограничения, поскольку он имеет требования типа Self или связанные с ним.

Поскольку swift не поддерживает внедрение протокола со связанными типами. Что можно сделать, чтобы решить эту проблему?


person Costello    schedule 01.01.2018    source источник


Ответы (1)


Попробуйте передать параметр универсального типа структуре LoginViewModel и использовать его вместо этого:

struct LoginViewModel<DBM: DataBaseManager> {

    var dbManager: DBM

    init(dbManager: DBM) {
        self.dbManager = dbManager
    }
}
person mmr118    schedule 01.01.2018
comment
Это решило мою проблему, спасибо. - person ADB; 18.02.2021