2017-04-10 4 views
1

realmオブジェクトのクラス名である文字列に基づいてrealmオブジェクトをインスタンス化することは可能ですが、提供されるまでその文字列がどのようになるかは分かりません。 。例えばrealmオブジェクトをswiftでstringから取得する3

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

私は私が得るJSONを通過し、アレイ内の各JSONオブジェクトからレルムオブジェクトを作成したいです。問題は、このメソッドが複数回呼び出され、変更されるたびにclassName変数のみが呼び出されることです。ですから、私は同じロジックを持ついくつかのメソッドを作成する代わりにこのロジックを1つのメソッドに保持したいと思います。作成するレルムオブジェクトを決定する巨大で複雑なif else。ここで

は、これが機能し、私が欲しいものを達成することが可能であるかどうかしない理由を誰かが説明できますか?

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)! 
    } 
} 

をgetRealmObjectBasedOnStringされますか

答えて

0

NSClassFromStringを使用して文字列からRealmオブジェクトタイプを取得できますが、Swiftはネームスペースにモジュールを使用しているので、クラス名の前にアプリのモジュール名を追加する必要があります。

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

let objectList = realm.objects(objectType) 
+0

私はあなたが達成したいと誤解したと思います。私はすでに持っているタイプの領域オブジェクトを取得しないでください、私は新しいものを作成したいです。だから私は文字列 "ClassA"を送信する場合、私は領域に保存することができますClassAオブジェクトのインスタンスを取得したいと思います。 – Filipe

+0

次に、['create(_:value:update:)'](https://realm.io/docs/swift/2.5.1/api/Classes/Realm.html#/s:FC10RealmSwift5Realm6createuRxCS_6ObjectrFTMx5valueP_6updateSb_x)を使用するだけです。 – Dmitry

+0

それは私が欲しかったものです!私はちょうどforループで送られたものからjsonオブジェクトを作り直す必要がありました。それはそれです。ありがとう:D – Filipe

関連する問題