MaxTemp構造体の各要素をForEachで一つずつ取り出して処理するには、まず構造体のプロパティを配列に変換する必要があります。SwiftUIのForEachは、通常、配列やRangeのようなRandomAccessCollectionに準拠したコレクションを処理するために設計されているためです。
以下に、MaxTempのインスタンスを初期化し、そのプロパティを配列に変換してForEachで表示する完全なサンプルコードを示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import SwiftUI // MARK: - データ構造 struct MaxTemp: Codable { let first: String let second: String let third: String let fourth: String let fifth: String let sixth: String let seventh: String } // MARK: - 配列に変換する拡張 extension MaxTemp { // 構造体のプロパティ値を順序付けられたStringの配列として返す var toArray: [String] { return [first, second, third, fourth, fifth, sixth, seventh] } } // MARK: - ビュー struct MaxTempView: View { // MaxTempのオプショナルな変数(データ取得をシミュレーション) @State var maxtemp: MaxTemp? = MaxTemp( first: "28℃", second: "25℃", third: "26℃", fourth: "27℃", fifth: "29℃", sixth: "24℃", seventh: "23℃" ) var body: some View { VStack(alignment: .leading, spacing: 10) { Text("週間最高気温") .font(.title) .bold() // maxtempがnilでない場合のみコンテンツを表示 if let temperatures = maxtemp?.toArray { // 配列化したデータに対してForEachを使用 // .indicesを使用してインデックスと共に要素を取得し、日数を表示 ForEach(temperatures.indices, id: \.self) { index in HStack { // 日数を計算して表示(ここではインデックスに1を足している) Text("Day \(index + 1):") .frame(width: 60, alignment: .leading) // 温度の値 Text(temperatures[index]) .foregroundColor(.blue) .bold() Spacer() } .padding(.vertical, 2) Divider() } } else { Text("データがありません") .foregroundColor(.gray) } } .padding() } } // プレビュー #Preview { MaxTempView() } |
解説
- 配列への変換 (
extension MaxTemp)MaxTemp構造体に**toArray**という算出プロパティを追加しています。- これは、構造体の
firstからseventhまでのプロパティの値を順序通りにStringの配列として返します。
|
1 2 3 4 5 |
extension MaxTemp { var toArray: [String] { return [first, second, third, fourth, fifth, sixth, seventh] } } |
ForEachで処理するためには、この配列が必須です。
オプショナルな変数 (@State var maxtemp: MaxTemp?)
- 元の質問の通り、
maxtempをオプショナル (MaxTemp?) として宣言しています。@Stateはビュー内で値を変更可能にするために使用しています。 - 実際のアプリでは、この変数がAPIなどからデータが取得されるまでは
nilになり得ます。
オプショナルのアンラップとForEach
body内で、まずif letを使ってmaxtempをアンラップし、さらにtoArrayで配列に変換しています。
|
1 2 3 |
if let temperatures = maxtemp?.toArray { // ... } |
ForEachは、配列temperaturesのインデックス (.indices) を使ってループ処理を行っています。インデックスをIDとして使うため、id: \.selfを指定しています。
|
1 2 3 |
ForEach(temperatures.indices, id: \.self) { index in // ... 処理 ... } |
indexを使って、インデックスと値 (temperatures[index]) の両方にアクセスし、表示処理を行っています。

コメント