質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

182閲覧

Tableviewcellに渡す配列の型と生成方法について教えて下さい。

bkyj5374

総合スコア18

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/06/27 07:02

Tableviewのcellに3つのラベルを貼りたいので、TextData1を用意し実行しました。
この状態で期待通りの動作をしてくれるので、今度はAPIで受信したjsonをTextData1と同じ形にすれば、無事に動作すると考え、
空の変数を用意し、APIの結果を代入してTableviewcellに利用しようと試みました。
しかし、TableViewで利用する変数をつくる部分でエラーとなり対処方法がわからず困っています。

swift

1 2import UIKit 3 4class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 5 6 @IBOutlet weak var APPNAME: UILabel! 7 @IBOutlet weak var Change: UIButton! 8 @IBOutlet var ApprovalTableView: UITableView! 9 10 // 11 var TestData1 = [ 12 ["ID":"19540921","NAME":"安倍 晋三","DOCUCODE":"https://www.abcdefg.com/19540921"], 13 ["ID":"19400920","NAME":"麻生 太郎","DOCUCODE":"https://www.abcdefg.com/19400920"], 14 ["ID":"19630110","NAME":"河野 太郎","DOCUCODE":"https://www.abcdefg.com/19630110"] 15 ] 16 17 // 18 var TestData2 = [[String:String]()] 19 // 20 var TestData3 = [[String:String]]() 21 22 //構造体を準備 23 struct JsonForm : Codable { 24 var ID : String 25 var NAME : String 26 var DOCUCODE : String 27 28 } 29 30 // 31 override func viewDidLoad() { 32 super.viewDidLoad() 33 34 ApprovalTableView.dataSource = self 35 ApprovalTableView.delegate = self 36 37 // 38 let listUrl = "https://省略します" 39 let APIurl = URL(string: listUrl)! 40 41 // 42 URLSession.shared.dataTask(with: APIurl) { (data, response, error) in 43 44 // 45 if (error == nil) { 46 //API成功 47 //print("API OK") 48 49 // 50 guard let data = data else { return } 51 52 print(type(of: self.TestData1)) //A: 53 print(type(of: self.TestData2)) //B: 54 print(type(of: self.TestData3)) //C: 55 56 // 57 do { 58 // 59 let json:[JsonForm] = try JSONDecoder().decode([JsonForm].self, from: data) 60 let top = json as NSArray //配列? 61 var i = 0 62 for _ in top { 63 64 // 65 print(i) 66 print("ID:"+json[i].ID) 67 print("NAME:"+json[i].NAME) 68 print("DOCUCODE:"+json[i].DOCUCODE) 69 70 /* 71 //TestData2に加える 72 self.TestData2[i]["ID"] = json[i].ID //D:ここで Thread 2: Fatal error: Index out of range 73 self.TestData2[i]["NAME"] = json[i].NAME // 74 self.TestData2[i]["DOCUCODE"] = json[i].DOCUCODE // 75 */ 76 77 /* 78 //TestData3に加える 79 self.TestData3[i]["ID"] = json[i].ID //E:ここで Thread 2: Fatal error: Index out of range 80 self.TestData3[i]["NAME"] = json[i].NAME // 81 self.TestData3[i]["DOCUCODE"] = json[i].DOCUCODE // 82 */ 83 84 i = i + 1 85 86 } 87 88 } catch { 89 90 print(error) 91 92 } 93 94 } else { 95 //API失敗 96 //print("API NG") 97 98 } 99 100 }.resume() 101 102 // 103 104 } 105 106 // 107 override func prepare(for segue: UIStoryboardSegue, sender: Any? ) { 108 109 // 110 if let detailVC = segue.destination as? DetailViewController, let indexPath = sender as? IndexPath { 111 112 detailVC.message = TestData1[indexPath.row]["DOCUCODE"] 113 114 } 115 116 } 117 118 //セッションの数 119 func numberOfSections(in tableView: UITableView) -> Int { 120 return 1 121 } 122 123 //セルの数 124 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 125 return TestData1.count 126 } 127 128 //セルのラベルに描写 129 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 130 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath ) 131 132 //tag1 133 let Label1 = cell.viewWithTag(1) as? UILabel 134 Label1?.text = TestData1[indexPath.row]["ID"] 135 136 //tag2 137 let Label2 = cell.viewWithTag(2) as? UILabel 138 Label2?.text = TestData1[indexPath.row]["NAME"] 139 140 //tag3 141 let Label3 = cell.viewWithTag(3) as? UILabel 142 Label3?.text = TestData1[indexPath.row]["DOCUCODE"] 143 144 // 145 return cell 146 147 } 148 149 //セルの高さ 150 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 151 return 100 152 } 153 154 //各セルをタップ 155 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 156 performSegue(withIdentifier: "MainToDetail", sender: indexPath) 157 158 } 159 160} 161

##教えて頂きたいことが2つあります。
質問1:TestData1での値が無い場合の宣言方法は、TestData2またはTestData3では間違いでしょうか?
ちなみに、TestData1、TestData2、TestData3をそれぞれ print(type(of:TestData)) すると、全て
Array<Dictionary<String, String>>
と表示されます。※A,B,Cの部分
正しい宣言をご教授下さい。

質問2:仮に宣言がTestData2またはTestData3で正しいとして、値を代入する記述をDやEの部分で実行すると、
Thread 2: Fatal error: Index out of range
となり、止まってしまいます。
配列の個数の問題のようなので、質問1に絡んでいると思うのですが、代入方法をご教授下さい。

宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/06/27 07:24 編集

>>今度はAPIで受信したjsonをTextData1と同じ形にすれば、無事に動作すると考え、 TextData1をJSONと同じフォーマット(JsonForm構造体)にして、正しく動作するようにした方がいいと思いますが。
takabosoft

2019/06/27 07:27

私もそれに賛成です。
guest

回答1

0

ベストアンサー

こんにちは。

質問1:TestData1での値が無い場合の宣言方法は、TestData2またはTestData3では間違いでしょうか?

ちなみに、TestData1、TestData2、TestData3をそれぞれ print(type(of:TestData)) すると、全て
Array<Dictionary<String, String>>
と表示されます。※A,B,Cの部分
正しい宣言をご教授下さい。

こういう場合は試しに

swift

1var TestData1: ***** = [ 2 ["ID":"19540921","NAME":"安倍 晋三","DOCUCODE":"https://www.abcdefg.com/19540921"], 3 ["ID":"19400920","NAME":"麻生 太郎","DOCUCODE":"https://www.abcdefg.com/19400920"], 4 ["ID":"19630110","NAME":"河野 太郎","DOCUCODE":"https://www.abcdefg.com/19630110"] 5 ]

の*****の部分に型を書いてみれば正解が判ります。
たぶん[[String: String]]でしょうね。

質問2:仮に宣言がTestData2またはTestData3で正しいとして、値を代入する記述をDやEの部分で実行すると、

Thread 2: Fatal error: Index out of range
となり、止まってしまいます。
配列の個数の問題のようなので、質問1に絡んでいると思うのですが、代入方法をご教授下さい。

[[String: String]]は辞書型を要素にもつ配列型です。
そして配列はデフォルトでは空っぽ(要素0)です。
どこかにアクセスしようとしても存在しませんのでエラーが出ます。
辞書を作って配列にappendしてください。

ただ、今回のケースで言えば、コメント欄で言及されているとおり、[[String: String]]型ではなく[JsonForm]型のまま取り扱うべきです。

その方が、各メンバへのアクセスが容易になります。

投稿2019/06/27 07:39

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bkyj5374

2019/06/27 10:39

仕組みを考え直す必要があるとの事ですね。 お二方のアドバイスに沿って、TextData1を組み直して動作確認してみます。 [JsonForm]型のまま取り扱えるよう試みてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問