ObservableObjectとは
ObservableObjectは、Combineフレームワーク内の一部の機能オブジェクトです。このオブジェクトを継承元クラスにして使用すると、SwiftUIで監視するすべてのプロパティに@Publishedをマークする必要がありますが、部品にBindingしているプロパティの変更した値が部品に反映できます。
下記コードはObservableObjectを継承したシンプルなクラスです。
class TObserver: ObservableObject { @Published var name: String init(_ s1: String) { self.name = s1 } }
nameという文字列を配置していて、@Publishedにしています。下記は、作成したTObserverをViewで利用するコードです。
struct ContentView: View { @ObservedObject var obj1 = TObserver("初期値") var body: some View { VStack{ TextField("Edit1", text: $obj1.name) Button("Button1", action: { self.obj1.name = "ボタンクリック後" }) } } }
View内でTObserverを作成していますが@ObservedObjectにしています。TextField(“Edit1”, text: $obj1.name)でTObserverのnameとBindingしています。ボタンがクリックされるとnameの文字列を変更し、TextFieldとBindingしているので同時に変更します。TObserverを@Stateにするとエラーは出ませんがTextFieldの値は変更しません。
@ObservedObjectが使えるのは、ObservableObject継承しているときのみです。従って、このTObserverクラスのObservableObjectを消した場合下記のエラーがでます。
Generic struct 'ObservedObject' requires that 'TObserver' conform to 'ObservableObject'
実行し、ボタンをクリックすると下記のような画面が表示されます。