2017-01-13 6 views
1

私はいくつかのjsonファイルからなるフォルダを持っています。文字列customObjectの辞書を繰り返し、customObject初期化子を呼び出します。

a.json 
b.json 
c.json 
c.json2 
c.json3 

各ファイルには、レルムDBに挿入する必要のあるデータが含まれています。 a =オブジェクトの1つのタイプ、b =別のタイプのオブジェクト、c.json1、c.json2およびc.json3はすべて同じタイプのオブジェクトですが、コンテンツの量のために3つのファイルに分割されます。

オブジェクトの種類ごとにforループを作成するのではなく、2番目のforループを繰り返し処理できる辞書を作成しようとしています。

A、B、Cはそうのようなオブジェクトである
var filesToProcess : [String: Object] = 
["a.json" : A(), "b.json" : B(), "c.json" : C()] 

    for (str, obj) in filesToProcess { 
     let numFiles = FileCounter().getNumFilesStartingWith(filename : str, url : unzippedDestinationUrl) 
     for i in 0...numFiles { 
      var append : String = "" 
      i == 0 ? (append = "") : (append = String(i)) 
      if let jsonData = try? Data(contentsOf: unzippedDestinationUrl.appendingPathComponent(str+append)){ 
       if let array = (try? JSONSerialization.jsonObject(with: jsonData, options: [])) as? [[String: Any]] { 
        for item in array{ 
         let itemJsonStr = item["data"] as! String 
         let item = obj(jsonStr : itemJsonStr) 
         DispatchQueue(label: "background").async { 
          let realm = try! Realm() 
          try! realm.write { 
           realm.add(item) 
          } 
         } 
        } 
       } 
      } 
     } 

    } 

import Foundation 
import RealmSwift 
import Realm 

open class A : Object { 

open dynamic var _id : String = "" 
open dynamic var prop1 : Int = 0 
open dynamic var prop2 : String = "" 

open override class func primaryKey() -> String? { 
    return "_id" 
} 
required public init() { 
    super.init() 
} 

public init(jsonStr: String) 
{ 
    if let dataDict = try? JSONSerializer.toDictionary(jsonStr){ 
     self._id = dataDict ["id"] as! String 
     self.prop1 = dataDict ["prop1"] as! Int 
     self.prop2 = dataDict ["prop2"] as! String 
    } 
    super.init() 
} 

required public init(realm: RLMRealm, schema: RLMObjectSchema) { 
    super.init(realm: realm, schema: schema) 
} 

required public init(value: Any, schema: RLMSchema) { 
    fatalError("init(value:schema:) has not been implemented") 
} 

} 

は、しかし、私のラインでループのために:

let item = obj(jsonStr : itemJsonStr) 

私はエラーが発生します:

Cannot call value of Non-function type 'Object' 

とにかくこの周辺にはありますか?私は何をしようとしているのですか、あるいは私がすでに行ったことに固執すべきですか?つまり、オブジェクトの種類ごとに繰り返しコードを持つ別々のループを作成する必要がありますか?注意:A、B、Cは異なるプロパティを持ちますが、すべてjson型の入力文字列で初期化されます

答えて

1

objはオブジェクトのインスタンスです。あなたが欲しいものを実装するために

一つの方法は、そこinit(jsonStr: String)を宣言し、このようなあなたの辞書を作り、あなたのオブジェクトの共通のスーパークラス(例えばMyObject)を作成することです:

var filesToProcess : [String: MyObject] = ["a.json" : A.self, "b.json" : B.self, "c.json" : C.self] 

、あなたは

を呼び出すことができるようになります
obj.init(jsonStr: ...) 

オブジェクトを作成する。

プロトコルを使用して同じことを達成できます。

さらにもう1つの方法は、使用して閉鎖することを実行することである。

var filesToProcess: [(String, (String) -> Object)] = [ 
    ("a.json", {json in A(jsonStr: json)}), 
    ("b.json", {json in B(jsonStr: json)}), 
    ("c.json", {json in C(jsonStr: json)}) 
] 

、その後obj(jsonStr : itemJsonStr)が実際に動作します。

(注:辞書の代わりに2タプルの配列を使用しています。

0

あなたは、あなたがこの

obj.parse(jsonStr: str) 
let item = obj 
を行うことができます

//let item = obj(jsonStr : itemJsonStr) 

新機能

func parse(jsonStr: String) { 
    if let dataDict = try? JSONSerializer.toDictionary(jsonStr){ 
     self._id = dataDict ["id"] as! String 
     self.prop1 = dataDict ["prop1"] as! Int 
     self.prop2 = dataDict ["prop2"] as! String 
    } 
} 

の代わりにこのラインを作ることができます

関連する問題