【SwiftUI】ViewModel は 単なる StateHolder なのか ? - ViewModel の役割

「ViewModel は必要なのか」というような話のときに、

「State置き場としての ViewModel」

というような言葉を聞いたりしていましたが。


@Observable final class StateHolder {
  var text = ""
}


var stateHolder = StateHolder()

TextField("text", text: Binding(
  get: { stateHolder.text },
  set: { newValue in stateHolder.text = newValue })
)


var stateHolder = StateHolder()

@Bindable var sh = stateHolder
TextField("text", text: $sh.text)

ドメイン部分というか複雑なデータ処理ロジック部分も置けますよね。

しかし。。。



👉 【SwiftUI】@State と 単方向データフロー hatena-bookmark
👉 【SwiftUI】ModelView は StateHolder なのか ? - ModelView の役割 hatena-bookmark


【SwiftUI】@State と 単方向データフロー

@State と Binding() を引数に受けるメソッドを使う場合で考えます。

「Binding」の意味のおさらいです。


@State var text = ""

TextField("text", text: $text)


@State var text = ""

TextField(
  "text",
   text: Binding(
     get: { text },
     set: { newValue in text = newValue }
   )
 )

双方向にデータは流れます。

 

🤔 単方向にデータを流す

State を外出しすることで、データの流れを単方向にします。


@Observable final class StateHolder {
  var text = ""
}


var stateHolder = StateHolder()

TextField("text", text: Binding(
  get: { stateHolder.text },
  set: { newValue in stateHolder.text = newValue })
)


var stateHolder = StateHolder()

@Bindable var sh = stateHolder
TextField("text", text: $sh.text)

 

🤔 まとめ

@State + $ での双方向のバインディングは、

外だしの @Observable クラスを使うことで、

単方向に流すことができます。



👉 【SwiftUI】ModelView は StateHolder なのか ? - ModelView の役割 hatena-bookmark
👉 【SwiftUI】View のロジック部分を外出しにする構成 hatena-bookmark


【SwiftUI】 スクレイピングで GitHub Contribution Graph をつくる

WEB-API もあるようですが。


❯ curl -s https://github.com/users/benigumocom/contributions

で、HTMLが取得できるというのでやってみる。

わーい。

guard ってなんとなく嫌いだなあ。

👉 GitHub Gist のコードをスクリプトから更新する方法 hatena-bookmark