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の使用目的を説明した。
コメント