おそるおそるSwift 番外編1 ObservableObject ObservedObject

Swift5+Xcode11.6
どこから頂いてきたのか記憶にないのですが、ディスクに保存されていた下のコードが理解できずに、いろいろ試行したときの備忘録です。
結果から言うと、ObservableObjectは複数のViewで共用できるという話なのですが、本当に理解できたのかは”?”です。
import SwiftUI class A: ObservableObject { @Published var property1:Int = 1 @Published var flag:Bool = false } struct ContentView: View { @ObservedObject var a = A() var body: some View { VStack { Subview1(a:a) .position(x:200,y:300) if a.flag { Subview2(a:a) Spacer() .frame(height: 100) } } } } struct Subview1:View { @ObservedObject var a:A var body:some View { VStack { Text("property1 = \(a.property1)").padding() Button(action: { self.a.property1 += 1 }) { Text("Click here to add 1") .foregroundColor(Color.white) .background(Color.green) } Toggle(isOn: $a.flag) { Text("Toggle to show Subview") .foregroundColor(Color.black) }.frame(width:250) } } } struct Subview2:View{ @ObservedObject var a:A var body:some View { VStack { Text("Subview") Text("property1 = \(a.property1)") } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
下の動画のように動きます。
わからなかったのは、Subview1(a:a)というところです。引数aにaを入れて渡すということになりますが混乱しました。そこで、Subview1(b:a)に変えてみました。どうなったかというと、下図のようにエラーが出ました。まあ、それはそうですね。引数bではなくaのままなので。

そこで、Subview1構造体の方も修正しました。
struct Subview1:View { @ObservedObject var b:A var body:some View { VStack { Text("property1 = \(b.property1)").padding() Button(action: { self.b.property1 += 1 }) { Text("Click here to add 1") .foregroundColor(Color.white) .background(Color.green) } Toggle(isOn: $b.flag) { Text("Toggle to show Subview") .foregroundColor(Color.black) }.frame(width:250) } } }
すると、正常に動作しました。当たり前といえば当たり前ですが、引数はaである必要はないことが分かりました。
次の疑問は、@ObservedObjectの書式が
@ObservedObject var a = A() (9行目)
@ObservedObject var b:A (24行目。ただし、先ほどの施行でaはbに変わっています。)
の2種類あることでした。必ずこうでなければならないのか確かめるために、
@ObservedObject var b:A を
@ObservedObject var b = A()
に変更してみたところ、正常に動作しました。どちらもa(又はb)をAクラス型のインスタンスとして宣言しているわけで、単に書式が違うだけですから、これも当たり前といえば当たり前です。
ちなみに
@ObservedObject var a = A() を
@ObservedObject var a:A
に変更すると、エラーが出ました。