2017-01-28 6 views
1

私のコードはでTableViewに2つの配列を作成し、にJSONデータを取得します。この2つの配列をマップすると、範囲外のエラーインデックスを取得しますArrayTableView配列マップ

func trainType() { 
    do { 
     /// 取得所有列車車種資料 
     let trainTypeUrl = URL(string: "http://ptx.transportdata.tw/MOTC/v2/Rail/TRA/TrainClassification?$format=JSON") 

     let trainTypeData = try? Data(contentsOf: trainTypeUrl!) 
     let trainTypeJson = try? JSONSerialization.jsonObject(with: trainTypeData!, options: .mutableContainers) 

     if let trainTypes = trainTypeJson as? [[String : AnyObject]] { 
      for dataTrainType in trainTypes { 


       trainTypeArray.append(dataTrainType as AnyObject) 
      } 
     } 
    } 
    self.tableView.reloadData() 
} 

func trainInOutstatusData() { 
    do { 

     let trainStatusUrl = URL(string: "http://ptx.transportdata.tw/MOTC/v2/Rail/TRA/LiveBoard?$format=JSON") 

     let trainInOutstatusData = try? Data(contentsOf: trainStatusUrl!) 
     let trainInOutStatusjson = try? JSONSerialization.jsonObject(with: trainInOutstatusData!, options: .mutableContainers) 
     if let InOutStatus = trainInOutStatusjson as? [[String : AnyObject]] { 
      for dataInOutStatus in InOutStatus { 

       trainStatusArray.append(dataInOutStatus as AnyObject!) 

      } 
     } 

    } 
    self.tableView.reloadData() 
} 

マップ配列

let stationClassID = trainStatusArray[indexPath.row]["TrainClassificationID"] as? String 
    let trainClassID = trainTypeArray[indexPath.row]["TrainClassificationID"] as? String 
    if stationClassID == trainClassID { 
     if let trainTypeID = trainTypeArray[indexPath.row]["TrainClassificationID"] as? [String : Any] { 
      let ZHtw = trainTypeID["Zh_tw"] as? String 
      cell.stationTrainClassID.text = ZHtw 

     } 
    } 
+0

両方の配列の値を一致させる前に、両方の配列の数を確認してください。両方のアレイで同じ数のデータを持っていますか? –

+0

この2つの配列サイズは異なります。 –

答えて

0

あなたは、両方の配列の異なるデータ数を持っているので、あなたがしようとしたとして行うことはできません。あなたがtrainstatusArray3カウントtrainTypeArrayで5カウントを持っていると考えているので、現在のindexPath.rowは4です。その後

let stationClassID = trainStatusArray[4]["TrainClassificationID"] as? String // You will get some value here. 
let trainClassID = trainTypeArray[4]["TrainClassificationID"] as? String // Here app will crash because, total count is 3 in but you are trying to access element at index 4. 

ソリューション:

あなたは、あなたが値が一致するか、されていませんチェックするcellForRowAtIndexpathfor loopを使用することができ、tableViewへのデータソースとして高い数を持つ配列を与えることができます。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let stationClassID = trainStatusArray[indexPath.row]["TrainClassificationID"] as? String 
    for trainType in trainTypeArray { 
     let trainClassID = trainType["TrainClassificationID"] as? String 
     if stationClassID == trainClassID { 
      if let trainTypeID = trainTypeArray[indexPath.row]["TrainClassificationID"] as? [String : Any] { 
       let ZHtw = trainTypeID["Zh_tw"] as? String 
       cell.stationTrainClassID.text = ZHtw 
      } 
     } 
    } 

} 

ありがとうございました。

+0

ありがとう、私はコードを試してみました仕事です。 –

+0

ようこそハッピーコーディング。 –

関連する問題