Swift・iOS

Swiftを中心に技術関連の記事を書いています

【Swift】APIからGETでデータを取得/CodableでJSONをデコード

過去に以下の記事で、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

 

■サンプルのイメージ

f:id:hfoasi8fje3:20190622185012p:plain

 

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

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

https://qiita.com/abouch/items/aca979b71ad792478687

https://qiita.com/BlackCat/items/c40cf2636e1dee63bc57