【Swift】Playground で API から JSON データを取得して デコード して画像を表示する 🐶

Xcode Playground 便利です。

ちょっとしたコード記述の確認に使えます。

今回は、通信処理まわりのコードをやってみました。

Dog API というのを利用しました。


https://dog.ceo/api/breeds/image/random


{
    "message": "https://images.dog.ceo/breeds/chow/n02112137_1015.jpg",
    "status": "success"
}

👉 Dog API hatena-bookmark

 

🐶 JSON の取得


let url = "https://dog.ceo/api/breeds/image/random"
let session = URLSession.shared
guard let (data, response) = try? await session.data(from: URL(string: url)!),
      let httpResponse = response as? HTTPURLResponse,
      httpResponse.statusCode == 200
else {
  throw // ...
}

print(String(data: data, encoding: .utf8)!)
// {"message":"https:\/\/images.dog.ceo\/breeds\/lhasa\/n02098413_5594.jpg","status":"success"}

 

🐶 JSON デコード


struct Dog: Decodable {
  let message: String
  let status: String
}


let data: Data = // ...
do {
  let decoder = JSONDecoder()
  decoder.dateDecodingStrategy = .millisecondsSince1970
  print(try decoder.decode(Dog.self, from: data))
} catch {
  throw // ...
}

// Dog(message: "https://images.dog.ceo/breeds/lhasa/n02098413_5594.jpg", status: "success")

 

🐶 WebKit で表示


let url = "https://images.dog.ceo/breeds/lhasa/n02098413_5594.jpg"
let view = WKWebView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let request = URLRequest(url: URL(string: url)!)
view.load(request)
PlaygroundPage.current.liveView = view

 

🐶 まとめ

以上をまとめたコードを貼っておきます。

Xcode Playground にベタ貼りするだけで動きます。

実行時にアレなので強引にメインスレッドに揃えています。


Task { @MainActor in
  // ...
}

前回に調べた内容を参考にしました。

👉 【Swift】URLSession.shared.dataTask() をうまく使いこなせない hatena-bookmark

よろしくおねがいします。

次回は、Concurrency をやってみたいと思います。