Tana Gone
Tana Gone
~1 min read

Categories

ContentViewにCounterクラスのインスタンスを注入する際にインスタンスを1つだけ生成する場合と複数生成する際の振る舞いの違いを比較する

  • 1つだけ生成、アプリケーションで共通の値を2つのWindowで使用できる。

    DI2

@main
struct StateObjectApp: App {
  var a: Counter = .init()
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environmentObject(a)
    }
  }
}
  • 複数生成、StateObjectの注入と同じ事ができ、Window毎に異なる値が注入される。

    DI1

@main
struct StateObjectApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environmentObject(Counter())
    }
  }
}

ContentViewは共通で次のとおり

class Counter: ObservableObject {
  @Published var count: Int = 0
}

struct ContentView: View {
  // 定義したクラスを読み込む
  @EnvironmentObject private var counter: Counter
//  @StateObject private var counter = Counter()

  var body: some View {
    VStack {
      Text("Count: \(counter.count)")
        .font(.largeTitle)
        .padding()

      Button(action: {
        counter.count += 1
      }) {
        Text("Increment")
          .font(.headline)
          .padding()
          .background(Color.blue)
          .foregroundColor(.white)
          .cornerRadius(10)
      }
    }
  }
}