前回、ObservableObjectを継承したクラスを使用したコードを紹介しました。そのクラスを使用しobjectWillChangeイベントを試してみます。
class TObserver:ObservableObject { @Published var num: Int init(_ i1: Int) { self.num = i1 } }
前回と同じく ObservableObjectを継承したTObserverという名称のクラスを作成しました。
クラス内にはnumという数値型の変数を用意しています。
View側で@ObservedObjectを指定した TObserverを用意し VStackのonAppear時にobjectWillChangeイベントを設定します。
onAppearはビューが表示されるときに実行されます。
下記は実装したコードです。
struct ContentView: View { @ObservedObject var obj1 = TObserver(100) @State var func1: Any? var body: some View { VStack{ Button("Button1", action: { self.obj1.num = 200 }) }.onAppear(perform: { self.func1 = self.obj1.objectWillChange.sink(receiveValue: self.changeAction1) }) } func changeAction1(){ print("Change before = " + String(obj1.num)) print("「obj1」の内容変更を知らせる") } }
onAppear内の処理は、@Stateで指定したfunc1: AnyにobjectWillChange.sink()を代入しています。これは、obj1「TObserver」の内容変更があった場合にchangeAction1を実行するように指定しています。func1を用意しない場合changeAction1は実行されませんでした。“Button1”のactionには、obj1.numに200を入れて変更させています。この“Button1″をクリックするとchangeAction1が実行されるようになります。obj1の変更される前の状態がobjectWillChangeに入ります。
![](https://d2doakw3sfctnd.cloudfront.net/202006041212.png)