インクルードファイルと言うべきかヘッダーファイルと言うべきか.
今回も説明が長いです, 独自ルールもあるしこのレシピ単体で動く代物じゃないので尚更.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS14.2
スポンサーリンク
「ショートカット」におけるライブラリ
iOS14になったことで「計算式」アクションが登場し, 複雑な計算が可能になりましたが, それでも似たようなものを何度も書くのは正直面倒です.
予めどこかに定義されていて, あとは変数に代入すべき値さえ指定すれば計算してくれる, そんなレシピがあると便利…ということで作ったものです.
C言語で当たり前に使っている演算や命令の一つ一つが実際には関数であるように, 予め定めた数式や文字式をライブラリとして確保し, 必要な時に呼び出して使う…というのが今回の目的です.
ダウンロード
ライブラリとなるテキストファイルのサンプルが記事本文の最後にあるのでそれを参考にしてください.
使い方
ライブラリファイルの作成・保存・ファイルパスの指定
ライブラリとなるデータはplist形式のテキストファイルです.
なので例えば
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>関数名</key>
<array>
<string>数式・定数</string>
<string>変数</string>
</array>
</dict>
</plist>
…という形を取り, 赤色太字の部分で一つのデータとなります.
データの記述については, 例えばx+1という数式を定義する場合は
<key>適当な関数名</key>
<array>
<string>x+1</string>
<string>x</string>
</array>
のようにkeyに好みの関数名を付け, 配列の先頭にあるstringに数式を, その後ろに代入する必要のある変数をstring形式で並べます.
数式はレシピ内で可能な範囲で対応していますが「計算式」アクションの例外処理を起こす可能性があるため演算順序に問題があると判断した場合それを明確にするための括弧を入れた状態にしてください.
ここで括弧はショートカットの仕様で"(", ")"のみ使用可能です.
<key>適当な名前</key>
<array>
<string>123.4^-5</string>
</array>
またレシピでは定数もライブラリとして追加可能です.
定数であっても配列であるarrayを書いてください.
また指数表示は10の指数のみ対応しており, 例えば上のように123.4^-5と書いた場合123.4×10^(-5)として処理されます.
こうして作成したplist形式のテキストを「ファイル」アプリの"Shortcuts"以下の任意の場所に保存します.
保存したファイルのパスを, レシピ先頭にある「テキスト」アクションの中に書き込むことではじめて使用可能となります.
サブルーチンとして使うには
配布時点でレシピの末尾は画像のようになっています.
レシピ自信を結果の表示として使う場合はこのままで良いですが, 関数(サブルーチン)として使う場合は最後の「結果を表示」アクションを削除した状態で使ってください.
その場合その上にある「リスト」アクションの結果がメインレシピに戻った時の出力になります.
「リスト」にある4項目の説明は次の「使用例1」にあります.
使用例1:定数の読み込み・表示
MathLibrarycutsを使うには決められたルールに従った「辞書」アクションを入力として渡す必要があります.
以降では使用例を挙げながら使い方を紹介します, まずはシンプルな定数から.
「辞書」アクションを追加し, 値を「配列」にしてキーに対応する名前を入れます.
定数の場合, 値には何も入れません.
そして「ショートカットを実行」でMathLibrarycutsを呼び出します.
たったこれだけ.
これで「辞書」のキーに対応する値(今回は白銀比)の値が表示されます.
ここで結果に4項目ありますが
- numerical formula
…MathLibrarycutsの入力として渡された値そのものです, 例外処理あり - formula
…文字式, 今回は定数なので表示されません - value
…ショートカット内の「計算式」による結果 - V
…基本的に上と同じですが, 後述する指数定数の場合仮数分と指数部を分けて結果とします.
場合によってはMathLibrarycutsに渡した変数そのものになるため無意味な値の可能性あり
, となっています.
単純に結果を得たい場合はvalueを使うのが普通です, ただ小数の場合画像のようにショートカット内で桁数が減ってしまうこともあります.
画像は万有引力定数の場合ですが, このように結果が小さい値の場合, valueは当然小さくなります.
物理定数のように微小な定数を扱う場合は仮数部と指数部を分けて後者の演算を後回しにしないとただでさえモノによって曖昧なものが更に精度が落ちることになります.
そもそもそうなることがわかっていれば今回の手法を取らない方が良いでしょうね.
使用例2:式を読み込んで変数に値を代入(その1)
次は関数を読み込んで対応する変数に値を代入して計算させる方法です.
先程と同じように, 値を「配列」にした辞書を追加しますが, 今回は配列として対応する分の値を追加します.
プログラミングの関数同様, 変数の数が一致しないと正しく機能しません.
文字式の場合, numerical formulaの中にどの変数に何の値が与えられたかが格納されています.
文字式なのでformulaの中に対応する関数の式が代入されたためその表示がされています.
使用例3:式を読み込んで変数に値を代入(その2)
「辞書」アクションは複数のキーと値の組を入れることができますからその場合も考えてみます.
これまで紹介したのと同じものを一つの「辞書」に追加していき, 「辞書の値を取得」ですべてのキーを取得することで「リストから選択」アクションで選ぶことができます.
選択した対象は辞書のキー, それを使って「辞書の値を取得」で対応する値も取得できますからこれを新しい「辞書」にマジック変数で貼り付け, これを入力としてMathLibrarycutsを呼び出します.
これで, 選択した関数に応じて結果を返します.
使用例4:式を読み込んで変数に値を代入(その3)
前述までは, 代入する値が固定でした, なのでこれを好きに設定できる場合も想定します.
また「値」を取得する別の方法も合わせて紹介します.
例として判別式の計算を行います, 判別式なので変数は3つ.
一つ一つ「入力を要求」で入力させ, 前回は新規の「辞書」の値にマジック変数を使っていましたが今回は「変数に追加」で値を配列として格納します.
別の「辞書」を追加し, 配列型のキーに対応する関数名(今回は「判別式」), 値に上記で「変数に追加」で格納した値の列を入れ, これを使ってMathLibrarycutsを呼び出します.
この手法でも結果を表示してくれます.
使用例5:式を読み込んで変数に値を代入(その3の変則)
上記では値の格納に「変数に追加」アクションを用いましたが, 「辞書」の配列それぞれにマジック変数で置くことももちろん可能です.
しかし上記の方が簡単でわかりやすいですね.
〆
実用に足るかどうかはさておき, iPhone単体でこのようなものが作れることが分かりました.
まだたかだか10個分なので, これが大きくなると読み込みにどれだけ負担がかかるか…が現状の不安定要素です.
ライブラリとしてplist形式のテキストファイルを選択しましたが, 結局辞書として取り込むので予め辞書として作る選択肢もあります.
サンプルライブラリ
あまり数はないですが参考までにいくつかの数式や定数を書いたplistを紹介しておきます.
これをそのままコピーして「ファイル」アプリに保存, そのテキストファイルのパスを指定すればこの内容で使えます.
ここから更に追加して自由に使ってください.