前回の単語帳ショートカットを利用した辞書アクションは正直わかりにくいものでした.
あれからそこそこ理解できたのでわかりやすく一部を改良しました.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のバージョン : v4.0.1
スポンサーリンク
その前に
辞書アクションは「キー」と「値」の組をJSONという構文で扱うことは前回も紹介した通りです.
また辞書アクションは「値」を辞書とすることでどんどん入れ子にすることが可能です.
そのように入れ子にした辞書の深い「値」を取得するのに前回は親となる辞書のキーから値である子の辞書を取得し, 更にその辞書の値を取得…という手法を取っていました.
「辞書の値を取得」アクションの説明によると, 値を取得するのにキーをピリオドで区切ることで深い階層にある値を簡単に取得することが可能です.
わかりやすくJSONで言うところの
{"a":[{"b":"c"}]}
, つまり親の辞書のキーがa, その値が辞書 {"b":"c"} である場合, 値 c を取得したい場合「辞書の値を取得」アクションの「キー」に
a.b
と打ち込めば良いわけです(上画像①).
これで上記のように作ったアクションを実行するとちゃんと辞書の中に入れ込んだ辞書の値 c を取得出来ていることが確認できます.
フロー
では前回から少し改良したフローを先に紹介し, その後個別に解説します.
今回はきちんと値を得られているかを確認するのが目的のため単語帳としての目的である最後のif文は割愛します.
①辞書の生データ
単語帳の素となる単語と意味のセットです.
前回同様元々の辞書のキーにランダム用の番号を, 値は辞書としてそのキーに単語, 値に意味を入力します.
変数は後で振り返るときにわかりやすくするためなので必須ではありませんが今回は「辞書生データ」と名付けました.
イメージとしては, 番号と単語, 意味の組を辞書の入れ子は
n=(word=meaning)
となっています.
②乱数を発生させてその番号の単語セットを取得
①で作成した分の辞書数に合わせて乱数を取り, 「辞書の値を取得」アクションで
- 辞書 → 辞書生データ
- キー → 乱数
- 値 → 値
とします.
正しく取得できていればこの変数は {"a":[{"b":"c"}]} のうち {"b":"c"} であるはずです(aはランダム).
③単語セットから単語を取得
②でwordとmeaningの組の辞書を取得したのでここから「辞書の値を取得」アクションでwordを取り出します.
- 辞書 → ランダム単語セット
- キー → 記入不要
- 値 → すべてのキー
「値」を「すべてのキー」にすると「キー」部分が非表示となります.
これでランダムに取得した単語セットから単語が取り出せました.
単語セットから意味を取り出す
続いて入れ子となった辞書である単語セットからその値である「意味」を取り出すのですが前回の方法とは別に最初に触れた方法の2通りがあります.
④これまでの方法
まずは入れ子となった辞書を取得し, そのキーである単語から値である意味を取り出す方法です.
今回は③で既にそのキーである単語を取得してしまっているため, 画像のように「辞書の値を取得」アクションで
- 辞書 → ランダム単語セット
- キー → 単語セットの単語
- 値 → 値
, この一アクションで済みます.
⑤階層を一発指定する方法
もう一つが最初に説明した, 深い階層を一発でキー指定する方法です.
これまでの変数の名付けを踏まえるとランダム単語セットは
乱数=(単語セットの単語=意味)
となっているため, 欲しい「意味」を得るには然るべき「乱数」と「単語セット」を
乱数.単語
のようにピリオドで繋げ, これをキーとします.
今回は元の辞書から指定することに注意すれば
- 辞書 → 辞書生データ
- キー → 乱数.単語セットの単語
- 値 → 値
となります.
今回は④でも書いた通りでこの手法を使う意味はないのですが理屈では④の結果と⑤の結果は同じであるはずです.
⑥結果確認
これまでのフローが正しいかどうかを確認するためのもので, 本来の目的とは関係ありません.
フローは以上です, これを実行して意図した結果になるか確認します.
単語や意味の内容はさておき, 画像のような結果になっていれば成功です.
④と⑤の結果が同じになっていることも確認しましょう.
〆
⑤のような, 深い階層を一発指定して値を取得する方法は, 親に至るキーが数である場合に特に生きると思います.
ようは数列や配列ですね.
先に思いついたというのもありますが乱数を使う手は基本というより応用だったかもしれません.