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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

1回答

1914閲覧

iOS初心者です。あるコードを、SwiftyJSONではなくCodableを用いてテーブルにデータを表示したい。

progleader

総合スコア19

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/04/30 11:18

編集2018/05/01 13:37

やりたいこと。

【Swift3.0】APIからJSONデータを取得して表示【初心者向け】の実装をCodableで行いたい。
現在、リンク通りにSwiftyJSONAlamofireを用いてリンク先の実装を行いましたが、
Swift4Codableを使って、JSONをパースし、テーブルに表示したい。

現在のコード

swift:ViewController.swift

1import UIKit 2import Alamofire 3import SwiftyJSON 4 5class ViewController: UIViewController { 6 var items: [JSON] = [] 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 let tableview = UITableView() 11 tableview.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 12 tableview.delegate = self 13 tableview.dataSource = self 14 self.view.addSubview(tableview) 15 16 let listURL = "http://qiita-stock.info/api.json" 17 Alamofire.request(listURL).responseJSON { response in 18 let json = JSON(response.result.value ?? 0) 19 json.forEach({ (_, data) in 20 self.items.append(data) 21 }) 22 tableview.reloadData() 23 } 24 } 25 26 override func didReceiveMemoryWarning() { 27 super.didReceiveMemoryWarning() 28 } 29} 30 31extension ViewController: UITableViewDelegate, UITableViewDataSource { 32 33 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 34 return items.count 35 } 36 37 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 38 let cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "TableCell") 39 cell.textLabel?.text = items[indexPath.row]["title"].string 40 cell.detailTextLabel?.text = "登校日:(items[indexPath.row]["send_date"].stringValue)" 41 return cell 42 } 43}

基本的にリンク先と同様です。

Codable利用にあたっって試したこと

Codableに準拠した構造体を作る。

swift

1struct Item: Codable { 2 var title: String 3 var send_date: String 4}

変えるべきところを模索

swift

1let listURL = "http://qiita-stock.info/api.json" 2Alamofire.request(listURL).responseJSON { response in 3 let json = JSON(response.result.value ?? 0) 4 json.forEach({ (_, data) in 5 self.items.append(data) 6 }) 7 tableview.reloadData() 8}

ここがCodableだと変わってくると思うのですが、以下のような、
以前学習したコードを試したり、トライアンドエラーしているうちに
時間が過ぎてしまったので質問をさせていただきました。

swift

1let decorder = JSONDecoder() 2let data = json.data(using: String.Encoding.utf8) 3let hoge = try decorder.decode(Hoge.self, from: data!) 4print(hoge.size.xxx) 5device.capacities.map { 6 print($0.rawValue) 7}

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

swift

1let stringJson = """ 2[ 3 { 4 "title": "Yesterday", 5 "send_date": "2018-04-30T00:00:00+09:00", 6 }, { 7 "title": "Today", 8 "send_date": "2018-05-01T00:00:00+09:00", 9 }, { 10 "title": "Tomorrow", 11 "send_date": "2018-05-02T00:00:00+09:00", 12 } 13] 14""" 15 16if let data = stringJson.data(using: .utf8) { 17 if let array = try? JSONDecoder().decode([Item].self, from: data) { 18 array.forEach { 19 print($0.send_date, $0.title) 20 //2018-04-30T00:00:00+09:00 Yesterday 21 //2018-05-01T00:00:00+09:00 Today 22 //2018-05-02T00:00:00+09:00 Tomorrow 23 } 24 } else { 25 print("json nil") 26 } 27} else { 28 print("data nil") 29}

投稿2018/04/30 18:26

編集2018/04/30 18:48
gingertail

総合スコア317

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

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

progleader

2018/04/30 21:58

ありがとうございます!かなりイメージが近づきました! .decode([Item].self,from:data)とするところが重要そうでしたね!! 最終ゴールとしては、これらのパースしたデータをprint出力ではなく、 tableに表示するコードを試行錯誤しているのですが、なかなかうまくいきません。。。 もしお分りではあればご教授頂けると幸いです。
gingertail

2018/05/01 03:14

データを取り出すところまでできたらあとは同じですよ
progleader

2018/05/01 13:30

1日やってみましたがちょっと厳しかったです。。。 もしお時間あればご教授いただけると幸いです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問