Avatar
import Combine class Foo: ObservableObject { @Published var a: Int = 0 @Published var b: String = "" static let shared: Foo = .init() } import SwiftUI struct ContentView: View { @ObservedObject var foo: Foo = .shared let cancellable = Foo.shared.objectWillChange.sink { _ in print("change") } var body: some View { print("body") return VStack { Text("a: \(foo.a)") Button("+") { Foo.shared.a += 1 } Text("b: \(foo.b)") Button("+") { Foo.shared.b += "+" } Button("++") { Foo.shared.a += 1 Foo.shared.b += "-" } } } } ↑のようにして、 ++ ボタンを押したときに FooobjectWillChange には 2 回値が流れる( "change" は 2 回表示される)けど、 "body" は 1 回しか表示されない。なんとなく、 @State とか @ObservedObject とかは変更が生じる度に body が実行されるのだと思ってました。当たり前かもしれないけど、ちゃんと setNeedDisplay みたいな仕組みが備わってるんですね。