Open2

SwiftUI: 動作の状態を管理する変数はダメ

kabeyakabeya

他のスクラップにも書きましたが、処理・動作の状態を管理する変数を用意して、その変数を見て動作を変えるクロージャを用いる、ということはできません。

例えば、以下のような処理です。

  • 何かをタップしたときに実行されるクロージャ内で、isTappingとかいう変数をtrueにして、someValueという変数を書き換える。書き換え後、isTappingをfalseに戻す。
  • someValue変数を監視するクロージャ内で、isTappingがどうなっているかによって動作を変える。

タップの際のクロージャが終わってからsomeValueの監視クロージャが実行されるので、isTappingの状態は監視クロージャが呼ばれる段階では期待する値(この場合ではtrue)になっていません。監視クロージャと書いていますが、animationモディファイアのクロージャやあるいは引数でも同じです。

isTappingを戻す処理を非同期で実行するという方法もありますが、そもそもの「isTappingがtrueの間は」という条件でブロックする仕掛けの意図から外れ、タイミングによってはうまく行かないケースが生じます。

kabeyakabeya

もしかして、Combineを使うと更新と監視が逐次処理でなく、交互(というか並列)に実行できるようになるのかしら。
それだとまた同時実行制御のような仕組みが要るような気がします。コンカレンシーと言っているのがそうなのかしら。