@StateObjectと@ObservedObjectの違い
StateObjectCounterは親Viewのcounterが更新されても値を保持しているのに対し、
OvservedObjectCounterは親Viewの値更新に伴い値が初期化されている。
ライフサイクルが異なる。
@ObservedObjectは親Viewが再描画される度(= 親Viewのプロパティが更新される度)に更新され、保持するViewが再描画される。
counter (親View)
StateObjectCounter (子View)
OvservedObjectCounter (子View)
import SwiftUI
struct ContentView: View {
@State var counter = 0
var body: some View {
VStack(alignment: .leading, spacing: 30) {
HStack {
Text("counter: \(counter)")
Button("count up") {
counter += 1
}
}
StateObjectCounter()
ObservedObjectCounter()
}
}
}
final class Counter: ObservableObject {
@Published var number = 0
func increment() { number += 1 }
func reset() { number = 0 }
}
struct StateObjectCounter: View {
@StateObject private var counter = Counter()
var body: some View {
HStack {
Text("StateObject: \(counter.number)")
Button("count up") {
counter.number += 1
}
Button("Reset") {
self.counter.reset()
}
}
}
}
struct ObservedObjectCounter: View {
@ObservedObject private var counter = Counter()
var body: some View {
HStack {
Text("OvservedObject: \(counter.number)")
Button("count up") {
counter.number += 1
}
}
}
}