【问题标题】:Instatiate Realm Object from string in swift 3在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)!
    }
}

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

【问题讨论】:

    标签: ios json swift swift3 realm


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多