SwiftUI | AnyCancellable, objectWillChange.sink/sendの使用目的

変数

SwiftUIのAnyCancellable, objectWillChange.sink/sendの使用目的を説明する。

結論

AnyCancellable, objectWillChange.sink/sendの使用目的を一言でいうと、Viewを更新することである。

  • Model-View-ViewModelの構造においてAnyCancellable, objectWillChange.sink/sendをViewModelに記述する。
  • Modelのオブジェクト.objectWillChange.sinkでModelの変化を監視する。
  • self.objectWillChange.sendでViewModel自身が変化したことをViewに伝える。
  • このことによりViewが更新される。

具体例

以下にAppの例を示す。

このAppは下図のようにModel-View-ViewModel(MVVM)の構造を持つ。Viewはユーザーインターフェース、Modelは変数HPを保持する場所、ViewModelはViewとModelの仲介役。

ボタンをタップするとModelの変数HPが減る。Modelの変数HPが減ったことはsinkによりViewModelに、sendによりViewに伝播される。これによりViewが更新される。

コードを以下に示す。

import SwiftUI
import Combine

struct ContentView: View {
    @StateObject var viewModel = ViewModel()
    var body: some View {
        Button("ヨシヒコを攻撃") {
            viewModel.model.HPが減る()
        }
        .buttonStyle(.borderedProminent)
        Text("ヨシヒコのHP : " + String(viewModel.model.HP))
    }
}

class ViewModel: ObservableObject{
    @Published var model = Model()
    var anyCancellable: AnyCancellable?
    init() {
        anyCancellable = model.objectWillChange.sink {
            self.objectWillChange.send()
        }
    }
}

class Model: ObservableObject {
    @Published var HP : Int = 100
    func HPが減る() {
        HP -= 1
    }
}

まとめ

SwiftUIのAnyCancellable, objectWillChange.sink/sendの使用目的を説明した。

コメント

タイトルとURLをコピーしました