【swiftUI】@PublishedでView外から取得したリストをView内でForEachする方法

SwiftUI リストの使い方 プログラミング




外部から取得したリストはそのままでは使えない

Viewの外でリストを用意して、それをViewでforEachしたいということは割とあると思いますが、簡単にはうまくいなかったので、解決策をまとめておきます。

解決策

最初にうまくいく方法を書いておきます。

import SwiftUI

struct ContentView: View {
 @ObservedObject var hoge = Hoge()

  var body: some View {
    hoge.setHogeList()
    ForEach(hoge.hogeList.indices, id: \.self) { index in
      Text(hoge.hogeList[index])
    }
  }
}
import Foundation

class Hoge : ObservableObject {
@Published var hogeList : [Int] = []

  func setHogeList() {
    for i in 0 ..< 5 {
      self.hogeList.append(i)
    }
  }
}

これでHoge classでhogeListセットした数字をViewのforEachで描画することができます。

ポイントは、forEachの書き方です。

ForEach(hoge.hogeList.indices, id: \.self)

NGなパターン

import SwiftUI

struct ContentView: View {
  var body: some View {
    ForEach(hoge.hogeList.indices) { index in
      Text(hoge.hogeList[index])
    }
  }
}

はい、id: \.self がありません。

forEachのイニシャライザには、以下の3つがありますが、Arrayの自身の要素のインデックス範囲を返す indices を使う場合には、2のinitを使うようにしましょう。

struct ForEach<Data, ID, Content> where Data : RandomAccessCollection, ID : Hashable {
// 1
  init(_ data: Data, @ViewBuilder content: @escaping (Data.Element) -> Content)

// 2
  init(_ data: Data, id: KeyPath<Data.Element, ID>, content: @escaping (Data.Element) -> Content)

// 3
  init(_ data: Range<Int>, @ViewBuilder content: @escaping (Int) -> Content)
}

参考:https://qiita.com/Kiuchi/items/39e3a4d5ee4be2186bcb

プログラミングを効率的に学ぶには、Udemyがオススメです。
Udemyは、世界最大の教育プラットフォームで、動画でスキルを学ぶことができます。

【セール95%OFF】オンライン学習ならUdemyがオススメ【プログラミング・ビジネススキル】
オンライン学習ならUdemyが一番オススメです。その理由を徹底解説します。プログラミングやビジネススキル、YouTube、ブログなど副業で稼ぎたい人もUdemyならオンラインで挫折せずスキルを身に付けられます。

Webサービス・スマホアプリ・ゲーム開発に役立つプログラミングスキルはもちろん、ブログやYouTubeで稼ぐために必要な集客・ブランディングなどを学ぶことができます。

セール期間中は、95%OFFになったり、30日間の全額返金保証もついているので、お得に安心して利用できます。




コメント

タイトルとURLをコピーしました