✨
JSONデータからSwiftUIのImageを動的に生成する方法
はじめに
SwiftUIでリスト表示やAPI連携を行う際、JSONに含まれる文字列をもとに画像を動的に読み込むことがあります。この記事では、JSONのimageName
フィールドをSwiftのモデルで受け取り、Image
ビューとして表示する方法を解説します。
前提
- XcodeのプロジェクトにAssetsカタログがあり、画像アセットが登録されている
- JSONデータに以下のような形式で
imageName
キーが含まれている
[
{ "id": 1, "imageName": "dog" },
{ "id": 2, "imageName": "cat" }
]
Decodable
とIdentifiable
モデル定義:struct Item: Decodable, Identifiable {
let id: Int
let imageName: String // JSONの'imageName'を受け取る
// 計算プロパティでSwiftUIのImageを返す
var image: Image {
Image(imageName)
}
}
-
let imageName: String
でJSONの文字列を格納 -
var image: Image
でImage(imageName)
を返す計算プロパティ
JSONの読み込み
JSONDecoder
を用いて配列としてデコードします:
let jsonData: Data = /* APIやファイルから取得したData */
let items = try JSONDecoder().decode([Item].self, from: jsonData)
-
items
は[Item]
型の配列 - 各要素の
imageName
にはJSONの値がセットされる
SwiftUIでの表示例
配列のインデックスやForEach
を使って、任意の要素を表示します:
List(items) { item in
HStack {
item.image // JSONに応じたImageビュー
.resizable()
.scaledToFit()
.frame(width: 50, height: 50)
Text("ID: \(item.id)")
}
}
-
items[0].image
→Image("dog")
-
items[1].image
→Image("cat")
ポイントまとめ
-
JSONはキー:値でデータを表現するフォーマットで、言語固有の
let
/var
は不要 -
Swiftのモデルで
Decodable
を採用し、let imageName: String
で受け取る -
計算プロパティ
var image: Image { Image(imageName) }
でビューを生成 -
表示時に配列のインデックスや
ForEach
で要素を選択し、それぞれに応じた画像を表示できる
以上が、JSONのimageName
を使ってSwiftUIで動的に画像を生成・表示する基本的な流れです。ぜひプロジェクトに取り入れてみてください!
Discussion