gpt4 book ai didi

ios - 在运行时指定 Realm 对象类型

转载 作者:行者123 更新时间:2023-11-28 05:52:21 25 4
gpt4 key购买 nike

我有 3 个 Realm 模型类,比如 ModelAModelBModelC。所有这 3 个模型都有一个参数名称 fav

在我的方法中,我想获取模型对象(可以是上述 3 种类型中的任何一种)并根据 API 响应更新 fav 参数。

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 对象时如何指定类名 realm?.object(ofType: Object.self, for the primary key : id).

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

最佳答案

您不需要使用 ModelType 将您的类名存储在 enum 中。相反,您可以使用 generics,这将使您的代码更短更简单。

我想这些类中的三个具有相同的参数,因为它们符合某些协议(protocol),或者它们是从具有此参数的某个父类(super class)继承而来的。如果它是一个父类(super class),假设它的名字是 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
}

如果您的模型类符合某些协议(protocol)(假设它的名称是 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)

关于ios - 在运行时指定 Realm 对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52481265/

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