在swift 3中从字符串实例化领域对象

Posted

技术标签:

【中文标题】在swift 3中从字符串实例化领域对象【英文标题】:Instatiate Realm Object from string in swift 3 【发布时间】:2017-04-10 15:55:22 【问题描述】:

我想知道是否可以基于作为领域对象的类名的字符串来实例化领域对象,但在提供之前不知道该字符串是什么。

例如:

for(_, object) in json["AllObjects"]
    let objectType = self.getRealmObjectBasedOnString(type: className, params: object.stringValue)
    self.objectList.append(objectType)

在这里,我浏览了一个我得到的 json,并希望从数组中的每个 json 对象创建一个领域对象。问题是这个方法会被多次调用,每次唯一会改变的是className变量。所以我想只在一个方法中保留这个逻辑,而不是创建多个具有相同逻辑的方法或一个巨大而复杂的 if else 来确定要创建的领域对象。

这里是getRealmObjectBasedOnString

func getRealmObjectBasedOnString(type: String, params: String) -> Object
    switch type 
    case "classA":
        return ClassA(JSONString: params)!
    case "classB":
        return ClassB(JSONString: params)!
    default:
        return DefaultClass(JSONString: params)!
    

有人可以解释为什么这不起作用以及是否有可能完成我想要的?

【问题讨论】:

【参考方案1】:

您可以使用NSClassFromString 从字符串中获取 Realm 对象类型,但请记住,Swift 使用模块来进行 nemespacing,因此您需要在类名之前添加应用程序的模块名。

guard let objectType = NSClassFromString("YourAppModuleName.\(json["className")") else 
    // handle unexpected class here


let objectList = realm.objects(objectType)

【讨论】:

我认为你误解了我想要完成的任务。我没有得到我已经拥有的那种类型的领域对象,我想创建一个新的。因此,如果我发送一个字符串“ClassA”,我想取回一个 ClassA 对象的实例,然后我可以将其保存到领域中。 那你只需要使用create(_:value:update:) 这正是我想要的!我只需要从 for 循环中发送的对象再次创建一个 json 对象,仅此而已。谢谢:D

以上是关于在swift 3中从字符串实例化领域对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 5.0 中从 AppDelegate 实例化窗口失败 [重复]

在Java中从该类的主体内部实例化对象

如何在 JavaScript 中从字符串实例化一个类

Swift:如何在实例化 viewController 之前加载 Firebase 数据?

在 Swift 中实例化一个新的 Codable 对象的最简单方法是啥?

实例化 Swift 类时调用站点出错