Swift学習を始めて「API通信」の学習をしているのですが、「APIって何?」「JSONってなに?」「Codableっとは?」という個人的な疑問を、この記事でまとめました。
0. そもそもAPIとは?
APIは Application Programming Interface の略です。
言葉を分解するとイメージが湧きやすくなります。
- Application:アプリ(LINE、天気アプリなど)
- Programming:プログラム(コード)
- Interface:接点・窓口
👉 つまり 「プログラム同士が情報をやり取りするための専用窓口」 です。
API通信で何をしてるの?
主に使われるのはこの2つです。
| メソッド | イメージ | 内容 |
|---|---|---|
| GET | ちょうだい! | サーバーに「データをください」とお願いする(例:天気予報の取得) |
| POST | これお願い! | サーバーに「データを登録して」と送る(例:SNSへの投稿) |
ステータスコード(サーバーからの返事)
200 OK: 成功!404 Not Found: そんな窓口(URL)はありません。
1. なぜAPI通信が必要なの?
現代のアプリは、ほぼすべてAPI通信で成り立っています。
- 天気アプリ:気象庁などのサーバーから最新データを取得
- ECサイト:商品在庫や決済情報をサーバーとやり取り
- SNS:みんなの投稿をサーバーから取ってきたり、自分の投稿を送ったりする
したがって、API通信は避けては通れない必須スキルなのです。
2. JSON(ジェイソン)とは?
APIという窓口でやり取りされる「データの書き方のルール」のことです。
👉 「データをやり取りするための共通言語」 と覚えましょう。
JSONの代表的な3パターン
パターン①:配列(Array)
[] で囲まれている。同じ種類のデータが並んでいる状態。
[
{"name": "Oyazi"},
{"name": "Ohukuro"}
]
パターン②:オブジェクト(Dictionary)
{} で囲まれている。「キー:値」のセット。
{
"user_name": "Oyazi",
"age": 50
}
パターン③:入れ子構造
オブジェクトの中に配列が入っているなど。
{
"users": [
{"name": "Oyazi"},
{"name": "Ohukuro"}
]
}
3. Swiftの「Codable」とは?
ここからは、Swiftを利用する際に、
Codableというプロトコルを理解する必要があります。まず、Codableの役割についてですが、
データを自動変換するプロトコルです・
・Decodable(デコード / 復号): 「戻す」イメージです。外部データ(JSON文字列など)を、プログラムで扱える形式(Swiftの構造体やクラス)に変換すること。
・Encodable(エンコード / 符号化): 「形を変える」イメージです。プログラム内のデータ(Swiftの構造体やクラス)を、外部でやり取りしやすい形式(JSON文字列など)に変換すること。
・Codable:上記2つのセット
// JSON形式
{
"id":"WLJJRKJeqjb",
"joke":"I used to work in a shoe recycling shop. It was sole destroying."
}
// Swiftの型として定義しておけば
struct Joke: Codable {
let id: String
let joke: String
}
4.API通信の全体の流れ
アプリがインターネットからデータを取ってきて画面に出すまでの流れになります。
① リクエスト作成(注文書の作成)
「どのURLに」「どんな方法(GET/POST)」で聞くか決めます。
② 通信(非同期処理)🚚
ここが超重要!通信は**「非同期(ひどうき)」**で行われます。
③ データ受け取り(JSON到着)📦
サーバーからデータが届きます。届いた直後はまだ JSON(ただの文字列) です。
④ データ変換(Codableで翻訳)📖
JSONDecoder(JSON→Swiftの型へ) を使って、ただの文字列だったJSONを、Swiftの 「構造体」 に一瞬で変換します。
⑤ 画面表示(UI反映)📱
変換したデータを画面にセットします。最後に「表側(メイン)」に戻して表示させて完了です!
まとめ
API = プログラム同士が情報をやり取りするための専用窓口
JSON = データをやり取りするための共通言語
Codable = Swiftで使いやすくする翻訳機
まだまだ表面しか覚えられていない感覚もありますが、API通信を理解する上で大事と思った3つのポイントでした。