やりたいこと。
【Swift3.0】APIからJSONデータを取得して表示【初心者向け】の実装をCodable
で行いたい。
現在、リンク通りにSwiftyJSON
とAlamofire
を用いてリンク先の実装を行いましたが、
Swift4
のCodable
を使って、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}
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/30 21:58
2018/05/01 03:14
2018/05/01 13:30