2017-01-18 7 views
1

私はAPIから以下の応答を受け取ります。モデルクラスにネストされた配列を追加する方法

{ 
    "data": [ 
    { 
     "CategoryName": "אהבה", 
     "CategoryID": "61", 
     "CategoryDate": "2016-08-26 02:11:43", 
     "CategoryImage": "love.png", 
     "SubCategoryArray": [ 
     { 
      "SubCategoryName": "אהבה", 
      "SubCategoryRefID": "61", 
      "SubCategoryID": "115", 
      "SubCategoryDate": "2016-08-29 09:25:56", 
      "TextArray": [ 
      { 
       "TextID": "103", 
       "Text": "<p dir=\"rtl\"><span style=\"font-size:48px\"><strong>אוהב</strong> אותך כל כך</span></p>\r\n" 
      }, 

どのようにサブカテゴリとTextArrayサブクラスをモデル化することができます。私は以下の通りであるJSONで 3.迅速なAPIレスポンスにクラスに応答をモデル化する必要があります。

私は、以下に示すよう

私のモデルクラスである私のモデルクラスを移入するSwiftyJSONを使用しています。

class Menu 
{ 
    var CategoryName: String? 
    var CategoryID: String? 
    var CategoryDate: String? 
    var CategoryImage: String? 
    var SubCategoryArray: [SubCategoryArray]? 

    init(CategoryName: String?, CategoryID: String?, CategoryDate: String?, CategoryImage: String?, SubCategoryArray: [SubCategoryArray]?) { 
     self.CategoryName = CategoryName 
     self.CategoryID = CategoryID 
     self.CategoryDate = CategoryDate 
     self.CategoryImage = CategoryImage 
     self.SubCategoryArray = SubCategoryArray 
    } 
} 


class SubCategoryArray 
{ 
    var SubCategoryName: String? 
    var SubCategoryRefID: String? 
    var SubCategoryID: String? 
    var SubCategoryDate: String? 
    var TextArray : [TextArray]? 
    init(SubCategoryName: String?, SubCategoryRefID: String?, SubCategoryID: String?, SubCategoryDate: String?, TextArray: [TextArray]?) { 
     self.SubCategoryName = SubCategoryName 
     self.SubCategoryRefID = SubCategoryRefID 
     self.SubCategoryID = SubCategoryID 
     self.SubCategoryDate = SubCategoryDate 
     self.TextArray = TextArray 
    } 
} 


class TextArray 
{ 
    var TextID: String? 
    var Text: String? 

    init (TextID:String? , Text: String?) 
    { 
     self.TextID = TextID 
     self.Text = Text 
    } 
} 

私が唯一の問題は、SubCategoryクラスとTextArrayクラスのためにそれを行う方法である

if let json = try? JSON(result){ 
var menus = [Menu]()      
for (_, content) in json["data"] { 
let menu = Menu(CategoryName: (content["CategoryName"].string), 
CategoryID: content["CategoryID"].string, 
CategoryDate: content["CategoryDate"].string, 
CategoryImage: content["CategoryImage"], 
SubCategoryArray: content["SubCategoryArray"].string) 
menus.append(menu) 
} 

としてそれを保存しています。

+0

?多分ユニットテストを書くことによって –

答えて

2

まず、変数名を小文字にすることをお勧めします。

また、彼らは配列ではありませんので、私は、SubCategoryTextからTextArrayクラス、およびSubCategoryArrayクラスの名前を変更するだろう、と名前が非常に誤解を招くことができます。

最後に、subCategoryArrayおよびtextArrayを、SubCategoryおよびTextの空の配列として、オプションではなく、初期化することができます。この方法では、将来使用するたびにnilを実行する必要はありません。ちょうどisEmptyをチェックしてください。

あなたがする必要があるのは、着信オブジェクトを反復して配列を作成することだけです。下のコードをご覧ください。代わりにswiftyjsonのObjectMapper使用しない理由

class Menu { 
    var categoryName: String? 
    var categoryID: String? 
    var categoryDate: String? 
    var categoryImage: String? 
    var subCategoryArray = [SubCategory]() 

    init(categoryName: String?, categoryID: String?, categoryDate: String?, categoryImage: String?, subCategoryArray: [Any]?) { 
     self.categoryName = categoryName 
     self.categoryID = categoryID 
     self.categoryDate = categoryDate 
     self.categoryImage = categoryImage 

     // lets check if SubCategoryArray is not nil 
     if let subCategoryArray = subCategoryArray as? [[String: AnyObject]] { 
      // lets iterate on the raw data 
      subCategoryArray.forEach({ (subCategoryCandidate) in 
       // Create category 
       let subcategory = SubCategory(subCategoryName: subCategoryCandidate["SubCategoryName"] as? String, 
        subCategoryRefID: subCategoryCandidate["SubCategoryRefID"] as? String, 
        subCategoryID: subCategoryCandidate["SubCategoryID"] as? String, 
        subCategoryDate: subCategoryCandidate["SubCategoryDate"] as? String, 
        textArray: subCategoryCandidate["TextArray"] as? [[String: AnyObject]]) 
       // Append to our array 
       self.subCategoryArray.append(subcategory) 
      }) 
     } 
    } 
} 

// lets rename this class only to SubCategory, because this is not an array at all 
class SubCategory { 
    var subCategoryName: String? 
    var subCategoryRefID: String? 
    var subCategoryID: String? 
    var subCategoryDate: String? 
    var textArray = [Text]() 
    init(subCategoryName: String?, subCategoryRefID: String?, subCategoryID: String?, subCategoryDate: String?, textArray: [[String: AnyObject]]?) { 
     self.subCategoryName = subCategoryName 
     self.subCategoryRefID = subCategoryRefID 
     self.subCategoryID = subCategoryID 
     self.subCategoryDate = subCategoryDate 

     if let textArray = textArray { 
      textArray.forEach({ (textArrayCandidate) in 
       let text = Text(textID: textArrayCandidate["TextID"] as? String, text: textArrayCandidate["Text"] as? String) 
       self.textArray.append(text) 
      }) 
     } 
    } 
} 

// Rename this to Text, because this is also not an array 
class Text { 
    var textID: String? 
    var text: String? 

    init(textID:String? , text: String?) { 
     self.textID = textID 
     self.text = text 
    } 
} 

USAGE

let url = URL(string: "YOUR-URL") 
let request = URLRequest(url: url!) 
let config = URLSessionConfiguration.default 
let session = URLSession(configuration: config) 

let task = session.dataTask(with: request, completionHandler: {(data, response, error) in 
    if let data = data, let json = try? JSON(data) { 

     var menus = [Menu]()      
     for (_, content) in json["data"] { 
      let menu = Menu(categoryName: (content["CategoryName"].string), 
          categoryID: content["CategoryID"].string, 
          categoryDate: content["CategoryDate"].string, 
          categoryImage: content["CategoryImage"].string, 
          subCategoryArray: content["SubCategoryArray"].arrayObject) 
      menus.append(menu) 
     } 

     print(menus) // prints 6 items for me 
    } 
}); 
task.resume()   

}

+0

?あなたはどういう意味ですか? – dirtydanee

+0

不条理な質問申し訳ありませんが、私はブレークを使用して結びついています。コードのこの部分はジャンプします。subCategoryArray = subCategoryArray { //生データに対して反復処理を行います subCategoryArray.forEach({(subCategoryCandidate)inおよび格納された値はnilです –

+0

BTWありがとうございました –

関連する問題