前回の例だとちょっと分かりづらいかもしれないのでもっと簡単にしたレシピを参考に説明します.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS15.1
スポンサーリンク
前回
今回使用するレシピ
前回サクッと紹介した、数を数える機能とカウントした値をクリアするレシピを少し手直したしたものを使います.
画像はレシピ全体です.
画像に降った番号や枠を主に説明します.
最初のこのアクションは、「ショートカットの入力」を扱うことで自動的にレシピ先頭に出てきます.
各オプションは今回はデフォルトのままで大丈夫です.
次にやり直したいデータをここで代入しておきます.
今回は数字0をcountという名前の変数に起きました.
この変数を「引き継ぎデータ」と呼ぶことにします(①).
この数0(場合によってはリストや辞書)はレシピをどれだけループしても一周目から変わることがないため、初期値と同じ扱いができます.
そこで「ショートカットを実行」でループしたときの入力に応じて、ショートカットの入力をそのまま引き継いだり、初期値を代入することで前回までの引き継ぎをクリアする…というのが今回の骨子です.
次にifを使って「ショートカットの入力」の有無で場合分けします(②).
引き継ぎデータでなくあくまでもショートカットの入力が対象です.
ここからはショートカットの入力に何らかの値が存在する場合です.
まず、ショートカットの入力を引き継ぎデータ(今回はcount)に上書きします(③).
レシピの初めで初期値が代入されていた引き継ぎデータが、これによってループ前の最後のデータに更新されます.
あとは緑で囲った枠のように、更新された引き継ぎデータを使って好きな処理を行います.
引き継ぎデータに変更を行いたい場合は必要に応じて「変数を設定」で上書きしたり…(④)
クリアが必要な場所では引き継ぎデータを空にします(⑤).
この「引き継ぎデータの上書き」や空にする操作さえ行えばよいため、レシピ次第では「メニューから選択」や「リストから選択」で行うとは限りません.
前者はより多くの組み合わせがありますが、いずれにしろこのアイデアを使ったレシピであればどこかで必ず後者のアクションを使って一度引き継ぎデータをクリアする状況があるでしょう.
なにか不都合があったり例外が起きたときにクリアするのもアリですね.
そしてレシピの一番最後に「ショートカットを実行」でこのレシピ自身を呼び出します.
このときオプションの「入力」に必ず引き継ぎデータの変数を当てておきます.
この「入力」に割り当てられた値は次のループ(厳密には「実行先のレシピ」)のショートカットの入力となります.
なので引き継ぎデータが空であれば一度目の実行時と同じ状況となり、空でない場合はif文(②)の真の場合を実行します.
フローチャートで見る
今回のレシピをフローチャートにすると画像のようになります.
実際には「メニューから選択」の部分がメイン処理、好きに処理する部分となります.
ここでレシピ上の注意があります.
ループの何周目かどうかに関係なく、もしそのループの初めに「ショートカットの入力」が空であった場合は画像上の明るいままのフローに従います.
具体的には
- ショートカットの入力 → 空
- 引き継ぎデータ → 初期値
となります.
「ショートカットの入力」が空となるループは、今回の場合以下の2種類です
- 一周目(実行時なので「ショートカットの入力」は必ず空)
- 引き継ぎデータを空にしたときの次のループ
後者が「クリア」に相当するわけですね.
この場合、最後の「ショートカットを実行」の入力に変数count、つまりレシピ先頭で初期値を代入した値が入っているため、次のループでの「ショートカットの入力」にはこの値が代入されるため、この状況からこのフローを2度通ることは決してありません.
クリアしたことによる例外処理などを行う場合、前者が面倒事になりそうです.
引き継ぎデータの型を辞書にして専用フラグを用意するのが無難でしょうかね.
二周目、または引き継ぎデータをクリアしなかった次のループは上の画像の明るいままの部分のフローに従います.
このとき、レシピ先頭で毎回初期値を代入していた引き継ぎデータの変数は「ショートカットの入力」によるif文の後に「ショートカットの入力」に上書き更新されます.
この中で引き継ぎデータをクリアしなければ、次のループも今回と同じになり、またクリアする操作を行えば、最後の「ショートカットを実行」の入力が空であるため、次のループの「ショートカットの入力」が空となり、今度はこの画像で暗くした方のフローへと変わります.
ということはそのフローによって引き継ぎデータに初期値が代入されたままループし、それが「ショートカットの入力」となる…ということが繰り返されます.
〆
このアイデアのキモは
- ショートカットの入力が空かどうかを判定する
- 「ショートカットの実行」で次のループに更新されたデータを渡すか空のデータを渡すか
の2点です.
仕組みが分かればあとは自由に使うだけです.