過去に以下の記事で、AlamofireとSwiftyJSONを使った例、SwiftyJSONを使わずにCodableでパースする例を扱いましたが、今回はAlamofireとSwiftyJSON使わない例となります。
https://www.hfoasi8fje3.work/entry/2018/06/03/201000
https://www.hfoasi8fje3.work/entry/2018/07/05/185348
■開発環境
・Xcode 10.2.1
・Swift 5.0.1
■サンプルのイメージ
■API側の前提
APIを叩くと以下のようにUITableViewの各セルに表示するタイトルを返す
(実際こんなAPIありませんが笑)
[ { "title": "item1" }, { "title": "item2" }, { "title": "item3" }, { "title": "item4" } ]
■アプリ側実装手順
1.StoryboardでUITableViewを配置
2.StoryboardのUITableViewをViewControllerに関連づける&ViewControllerに以下実装
import UIKit struct Item: Codable { var title: String } class ViewController: UIViewController { var items: [Item] = [] @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad()
self.tableView.delegate = self self.tableView.dataSource = self self.setUpTableItems() } private func setUpTableItems() { self.getTableItems(urlString: "{リクエストURL}", completionHandler: { (items) in self.items = items DispatchQueue.main.async { self.tableView.reloadData() } }) } func getTableItems(urlString: String, queryItems: [URLQueryItem]? = nil, completionHandler: @escaping ([Item]) -> Void) { var components = URLComponents(string: urlString) components?.queryItems = queryItems if let url = components?.url { let task = URLSession.shared.dataTask(with: url) { data, response, error in if let data = data { do { let decoder = JSONDecoder() let items = try decoder.decode([Item].self, from: data) completionHandler(items) } catch { print("Serialize Error") } } else { print(error ?? "Error") } } task.resume() } } } extension ViewController: UITableViewDelegate { // セル選択時の処理 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print(items[indexPath.row].title) } } extension ViewController: UITableViewDataSource { // セル設定 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell") cell.textLabel?.text = items[indexPath.row].title return cell } // セルの行数 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } }
■参考リンク
・https://developer.apple.com/documentation/swift/codable