Edited at

SwiftでAPIを用いる流れ(ライブラリを使わないversion)

iOSアプリにおいて、 AlamofireやSwiftyJSONなどのライブラリを用いずにAPIを利用する流れについてまとめてみました。 


使用するもの


やること

TableViewにAPIから取得したデータを一覧で表示する。

サーバーにHTTPリクエストを送り、返ってきたHTTPリクエストを受け取ってTableViewに表示する。


手順


①Codableを使ってJSONを受け取る構造体(モデル)を作る。


QiitaStruct.swift

struct QiitaStruct: Codable {

var title: String
var user: User
struct User: Codable {
var name: String
}
}


②HTTPリクエストの生成


URLオブジェクトの生成


QiitaViewController.swift

let url = "https://qiita.com/api/v2/items"



URLRequestオブジェクトの生成


QiitaViewController.swift

let request = URLRequest(url: url)



③HTTPリクエストを投げ、返ってきたレスポンスを受け取って配列に格納する。


URLSessionクラスのインスタンスからリクエストを送り、その後のデータを受け取った後の処理について記述する。


QiitaViewController.swift

let qiitaArray:[QiitaStruct] = []

let task = URLSession.shared.dataTask(with: urlRequest) { data, response, error in
guard let jsonData = data else { return }

do {
let articles = try JSONDecoder().decode([QiitaStruct].self, from: jsonData)
qiitaArray.append(articles)
} catch {
print(error.localizedDescription)
}
}
task.resume()



④格納した配列の値をTableViewに表示する。


QiitaViewController.swift

extension QiitaViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell")
let article = articles[indexPath.row]
cell.textLabel?.text = article.title
cell.detailTextLabel?.text = article.user.name
return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return articles.count
}

}


以上の手順により、以下のようにTableViewにデータを表示することができました。

Simulator Screen Shot - iPhone Xʀ - 2019-08-11 at 20.40.25.png

作成したQiitaAPIのサンプルプロジェクトは以下のGithubページからクローンできます。

サンプルプロジェクトでは、MVVM設計でコンポーネントを作って、少しだけ実装を抽象化しています。

https://github.com/YukiNagai1016/QiitaAPI