リクエストがあったのと, 健忘録として改めて整理しておきます.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS14.4
スポンサーリンク
「辞書」アクションとJSON,XML,plist
まずは各々の言葉について簡単に説明しておきます.
かなり端折ってるつもりですが長いのでスルーしてもOKです.
「辞書」アクション
「辞書」アクションはiOSのショートカットで使えるデータ記述アクションです.
「キー」とそれに対応する「値」の組を基本形として, 具体的には「キーの値を取り出す」ことでデータを取り扱います.
「値」には属性があり,
- テキスト
- 数字
- 配列
- 辞書
- ブール値
の5種類あります.
なので目的次第では「辞書の値を辞書にする」こともできます.
「辞書」アクションにおける「テキスト」と「数字」の種類(変数型, あるいはデータ型のこと)が区別されるのかは個人的にはよく分かっていません.
仮に数字の値を「テキスト」種類にしても, 後に計算したいときにそちらで種類を数字にしてしまえば良いからです.
むしろショートカットにおいてテキストや数字, URLといった「種類」の指定はその処理を行う場所で行うべきだと考えています.
というより状況によって, 対応するアクションで正しい「種類」になっていないと結果を誤ったりエラーとなって処理が強制終了してしまいます.
ただ「種類」に拘らなくてもちゃんと処理してくれる場合もあるんですよね, 例えば「計算式」アクションは数計算ですから対象が「テキスト」でであってはいけないはずですが, 実際には「数字」の扱いをしてくれます.
ショートカットにおいて「種類」, つまり変数型の扱いは状況によってシビアだったりいい加減だったりします.
JSONとXML
JSONとはJavaScript Object Notationの略称であり, 汎用的なデータ交換フォーマットです.
「辞書」アクションのキーに相当する「変数」とそれに対応する値の組を例えば
{"変数":値}
と書き表します.
XMLもデータ形式の一つですが, 記述方式はHTMLに似ており, 例えば「キー」と「値」をタグを用いて
<key>キー</key><string>値</string>
と書き表します.
両者にはいくつか違いはありますが, 一部の例外を除いてショートカットで扱う上で大きな違いはありません.
例外というのは「データ量が多い場合」です. そもそもJSONの方が軽量であるため, 可能であればそちらを採用したいところです.
XMLはタグを考えると全体の文字数が格段に大きくなる, つまりファイルサイズが大きくなります.
インデントを入れないと見づらいのは双方同じですね, まあそもそも編集することを想定しないならインデントも改行も取り除けばそれだけ多少は速くなります.
plist
plistはプロパティリストの略称で, その拡張子でもあります.
データや設定などのプロパティを格納するためのファイル形式で, もともとはNeXSTEPというOSで使われていたデータ形式だったそうですが, これを開発したNeXTソフトウェアをAppleが買収し, XMLを合わせたのが現在主にAppleで用いられるplistとなっているようです.
「辞書」アクションにおけるデータ形式
ショートカットの「辞書」アクションは「入力から辞書を取得」アクションを用いることで「辞書」アクション以外から辞書を取り込むことが可能です.
このとき取り込める形式として挙げられるのが
- JSON
- plist(XML)
の2種類です.
前者であるJSONは前述の通り, 例えば
{"変数":値}
と書き表したテキストを入力として辞書にします.
plistの場合はXML形式で記述します.
具体的には例えば下のように書きます.
1~4行目, そして8,9行目は固定です.
空行で開けた部分にkeyやstringといったタグを使ってデータを書き込んでいきます.
どちらを使っても良いのですが今回はMac OSで推奨している(という今回と特に関係ない理由で)plist形式で説明します.
通常の場合
まずは基本である「辞書」アクションに直接データを書く場合です.
単純に辞書そのものを表示させることで比較します.
キーがaのとき値が100, 同じくbのとき200である辞書を作りました.
結果は画像の通り
{"a":"100","b":"200"}
となりました.
今回値の種類を「テキスト」としたので値が"で囲まれています.
plistの場合
plistで記述する場合は『「辞書」アクションにおけるデータ形式』に貼ったコードのように書きます.
そのままではただのテキストなので, 「入力から辞書を取得」アクションを使う必要があります.
これで同じ結果となります.
もし例えば値の種類を数字にしたい場合は, stringタグの代わりにintegerタグを使います.
記述に誤りがある場合
アクションのように枠内にデータだけ入れるというやり方ではありませんからコーディングミスがありえます.
例えば画像のようにタグの記述に問題があると, 結果はJSONの形でないものになります.
あとで困らないよう, 予め「どういうエラーや想定しない結果になるか」を知っておくのは重要なことです.
アクションで書き分け
ことplistでは, 先頭にあるXML宣言などが入力や編集で邪魔に感じることがあります.
そこでplist全体からデータ本文を切り離し, マジック変数で繋げることで余計な箇所を気にせず編集する手法もあります.
配列
ちなみに配列を記述するには, arrayタグの中に値を入れていきます.
こうして記述したplistを辞書化して値を取り出すと…
ちゃんと値である配列が出力されています.
辞書
値は辞書にすることもできます.
「辞書」アクションもそうですよね.
plistでは画像で背景を暗くした部分のように, 値をdictタグで囲ってその中に辞書の組を入れていきます.
これで値である辞書が取り出せます.
これを「入力から辞書を取得」で辞書にすることでキーと値も取り出せます.
iCloudから読み込む
上記はショートカット内で完結していました.
しかしショートカットはメモ帳やiCloudなどの外部からファイルを取得することができます.
まずはiCloudからです.
メモ帳でもなんでもよいのでplist形式のデータをつくり, これを「ファイル」アプリの「Shortcuts」フォルダ以下の好きな場所に保存します.
JSONであればその拡張子はjson, plistのそれはplistですが, ここではどちらで記述したとしてもテキストファイルであるtxtで問題ありません.
必要であればファイルを長押しして「名称変更」をタップし, わかりやすい名前にしておきます.
「ファイル」に保存したplistを辞書にするには「ファイルを取得」アクションを使います.
「書類ピッカーを表示」をオフにすると下に「ファイルパス」の項目が表示されるので, ここに保存したファイルのパスを, "Shortcuts/"より後ろの部分だけ書きます.
今回は"Shortcuts"フォルダの"data"フォルダの中にdict.txtとして保存しているためパスは
data/dict.txt
となります.
「見つからない場合はエラー」のオプションは状況や好みで決めてください.
そしてこれを「入力から辞書を取得」で辞書にします.
「ファイルを取得」アクションはDropboxを選択することもできます, なのでこちらを介して扱うことも可能です.
メリット・デメリットを挙げるなら, iCloudならば一度保存ができればオフラインでも利用可能なことです.
メモ帳から読み込む
標準のメモアプリに書いたplistのテキストを読み込みことももちろん可能です.
まずメモ帳でplistデータを書き込んでおきます.
これを読み込むのですが, メモ帳にはiCloudのようなパスの概念がありません.
そこで「メモを検索」アクションを使ってフィルタすることで希望のメモを選択させます.
画像ではフィルタの対象を「本文」, その中に"xml"の文字列が含まれているものを対象としています.
また「制限」をオンにして1件だけにしています.
フィルタの条件を更に厳しくすればそれだけ確実になりますね.
plistでは
<!--
hogehoge
-->
と書くことでコメントアウトできるため, この中にメモを特定しやすいキーワードを入れ, それでフィルタをかけることでファイルパスの代わりとなります.
これでメモ帳に書いたplistを辞書としてショートカットで扱えるようになります.
その他のアプリから読み込む
Dropboxは上の通りで少し別格の扱いですが, 辞書として読み込むことのできるサードパーティ製アプリもあり, その一つがBearです.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
マークダウン対応のメモアプリですが, 早いうちからショートカットのアクションとして対応していました.
メモ帳のときと同様, メモにplist形式のデータを書いて, 画面右上の三点アイコンをタップして「リンクをメモにコピー」をタップします.
これでそのメモのカスタムURLスキームがクリップボードにコピーされます, そのうち末尾にあるid=より後ろの文字列が, そのメモの「識別子」で, これをファイルパスの代わりに使います.
Bearをインストールした状態であれば「Bearの内容を取得」というアクションがあるのでこれを追加します.
「メモの識別子」の欄に先程の識別子をペーストすることで対象のメモを出力できます.
あとはこれまで同様, 「入力から辞書を取得」で辞書にするだけです.
Tips(アクションの省略)
辞書の値を取り出すときに「辞書の値を取得」を使うのは基本的なことです.
しかし状況によってはこれを省略できます.
表示や対象にしたい場所でその辞書を設定し, 選択状態で画面下に出てくるメニューの「キーの値を取得」をタップします.
ポップアップが出てくるので入力枠に取得したい値に対応するキーを入力します.
これで対象の変数は指定したキーの値(のマジック変数)となります.
この場合だと「辞書の値を取得」が不要になるのでアクション数が一つ減ることになります.
一見メリットであるように感じるでしょうが当然デメリットもあって
- 辞書が複数ある場合、どの辞書のキー・値か曖昧になる
- 「名称変更」は使えない
などが挙げられます.
特に前者はアクションが長くなればなるほど後で辿るのが面倒になってきます.
一部のユーザーは好んでこの手法を使っていますがデバッグはどうでしてるんでしょうね.
〆
さまざまなデータの形式から, それをどこから読み込むか…までいくつかの選択肢, 組み合わせがあるわけですね.
「辞書」を扱うことで色んなデータをショートカットを使って簡単に制御できるようになります.
過去にいくつか紹介したAPIはその使用例の一つです.