Укажите тип объекта области во время выполнения - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть 3 класса моделей областей, скажем, ModelA, ModelB, ModelC.Все 3 из этих моделей имеют имя параметра fav.

В моем методе я хочу получить объект модели (который может быть любого из трех указанных выше типов) и обновить параметр fav на основе ответа API.

enum ModelType {
  case ModelA
  case ModelB
  case ModelC
}

func update(type: ModelType, id: Int) {
   let realm =  try Realm()
   if let model = realm?.object(ofType: Object.self, forPrimaryKey: id) {
      do {
          try realm?.write {
          let favourite = FavModel()
          model.favourite = favourite
          realm?.add(model, update: true)
         }
      } catch {}
      return model
    }
     return nil
 }

У меня есть enum, который может сказать мне, что это за объект модели, но не уверен, как указать имя класса при извлечении объектов области realm?.object(ofType: Object.self, for the primary key: id).

Object.self должен быть либо ModelA.self, ModelB.self или ModelC.self.

1 Ответ

0 голосов
/ 24 сентября 2018

Вам не нужно использовать ModelType для хранения имен ваших классов в enum.Вместо этого вы можете использовать generics, что сделает ваш код короче и проще.

Я полагаю, что три из этих классов имеют один и тот же параметр, потому что они соответствуют некоторому протоколу или унаследованы от некоторого суперкласса.у которого есть этот параметр.Если это суперкласс, скажем, его зовут SuperModel.В этом случае ваш метод должен выглядеть следующим образом:

func update<StoredType: SuperModel>(type: StoredType.Type, id: Int) {
    let realm = try? Realm()

    if let model = realm?.object(ofType: type, forPrimaryKey: id)  {
        // handle your model
    }

    return nil
}

Если классы вашей модели соответствуют какому-либо протоколу (скажем, он назван ModelProtocol), тогда ваш метод должен выглядеть следующим образом.

 func update<StoredType: Object & ModelProtocol>(type: StoredType.Type, id: Int) {
    let realm = try? Realm()

    if let model = realm?.object(ofType: type, forPrimaryKey: id)  {
        // handle your model
    }

    return nil
}

При этом вы можете просто вызвать этот метод, передав тип вашей модели в качестве параметра

update(type: ModelA.self, id: 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...