在运行时指定领域对象类型

时间:2018-09-24 14:11:52

标签: ios swift realm

我有3个领域模型类,例如ModelAModelBModelC。所有这三个模型均具有参数名称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
 }

我有一个枚举可以告诉我它是哪种模型对象,但不确定在获取领域对象realm?.object(ofType: Object.self, for the primary key: id)时如何指定类名。

Object.self应该是ModelA.selfModelB.selfModelC.self

1 个答案:

答案 0 :(得分:1)

您无需使用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)