更新:2020-08-25
作成:2020-08-02

変数

本章では、ショートカットAppにおける「変数」について説明します。
なお変数のデータ型の一覧については、「変数一覧」のページを参照してください。

変数

ショートカットAppでいう「変数」は、一般的なプログラミング言語でいわれている「変数」とは意味合いがやや異なります。
正確に説明するならば、オブジェクト指向プログラミングにおける「クラス」のことです。
(※ C++, C#, Objective-Cでは「クラス」、Swiftでは「構造体」と呼ばれています。)
クラスの概念を理解するためには、オブジェクト指向プログラミングについて知る必要がありますが、当アクションリファレンスの範囲を超えてしまうので説明は行いません。
なおショートカットAppでは、クラスやクラスの構造についての説明を避け、平易な言葉で「変数」と呼んでいます。
当アクションリファレンスでは、ショートカットユーザガイドの表記に従って「変数」と表記することとし、オブジェクト指向プログラミングの理論で説明する必要がある場合は「クラス」と表記します。

〈参考〉
 → 「ショートカット」の変数について - Appleサポート

変数は、青色で角丸の四角いトークンで、「計算数字」のように表示されます。
未定義の変数をアクションで使用した場合、値は空(Nil)になります。
ただしアクションによっては空に対応しておらず、エラーが出たり、コンテンツ・グラフ・エンジンによりいいえ(ブール値のFalse)に変換されてしまうことがあります。

余談ですが、オブジェクト指向プログラミングではアクションも「クラス」として実装されています。
またアクションと「マジック変数」を除くすべての変数は、メソッド(メンバ関数)を持つクラスです。
オブジェクト指向プログラミングの考え方で理解するなら、「変数」は値を保持するためのアクションだと考えたほうがいいかもしれません。
なおトークンの色は、バージョン2.2までは手動変数だけが青色で、特殊変数は緑色でした。
(※手動変数とは、アクション「変数を設定」・「変数に追加」で作成した変数。)
また特定のプロパティの値を指定した場合は灰色になり、変数名の後ろに指定したプロパティ名が表示されていました。
残念ながら現在は青色に統一されているため、見た目では変数の種類の区別がつきづらくなっています。

特殊変数

特殊変数は、特別な機能を持った変数です。
クリップボード」・「現在の日付」・「毎回尋ねる」・「ショートカットの入力」・「繰り返し項目」・「繰り返しインデックス」・「○○の結果」の7種類と、「マジック変数」が存在します。
オンスクリーンキーボードの上にある変数トレイ、もしくはピッカーを使って入力します。
手動変数ではないため、アクション「変数を設定」・「変数に追加」で値を変更・追加することはできません。
使い方については、「変数一覧」のページの「特殊変数」の項を参照してください。

画像の上部が、変数トレイ
画像の上部が、変数トレイ

ショートカットの入力

他のアプリやレシピから渡された値を格納している、特殊変数です。
そもそもiOSの共有機能では、すべてのデータは単純な値ではなく、クラスという形にして受け渡ししており、ショートカットAppではこれをそのまま、変数「ショートカットの入力」にしています。
ちなみに、レシピの「共有シートタイプ」のタイプは、iOSのクラスの種類です。
そのため「共有シートタイプ」でタイプを指定すると、不要なクラスの型(変数のデータ型)を受けとらないようにすることができます。

○○の結果

○○の結果」は、アクション「if文」・「メニューから選択」・「繰り返す」・「各項目を繰り返す」のマジック変数です。
そのアクションの中のブロックで、最後のアクションの値を格納する変数です。
アクションの処理内容によって、データ型・値を変えたいときに使われます。

マジック変数

マジック変数」は、アクションの戻り値(出力)を格納する特別な特殊変数です。
1つのアクションにつき、1つ自動作成されます。
そのため通常の変数と違い、使用する前に変数を作成しておく必要はありません。
データ型は、アクションの出力に応じて自動で決定されます。
ただし、戻り値が存在するはずがないアクションでは、原則としてマジック変数は作成されません。

変数名

変数には、名前をつけることができます。
人間が見た目で変数を区別するためにつけるものなので、使えない文字・予約語などの制限はありません。
マジック変数・特殊変数については、それぞれ独立した別の変数として扱われるため、変数名が重複してしまったとしても問題ありません。
ただし手動変数の変数名が重複してしまった場合、すべて同じ変数だと見なされます。

変数のデータ型

普通のプログラミング言語では、変数に入れる値の種類によって、適切なデータ型(変数型)の変数を使用する必要があります。
ただし、前述のように変数はクラスであり、またコンテンツ・グラフ・エンジンによって自動型変換が行われるため、データ型が違っていてもあまり問題になることはありません。
なおデータ型の一覧は、変数一覧のページを参照してください。

余談ですが、ショートカットAppで使うことができるデータ型は、以下のように分類されます。

コンテンツ・グラフ・エンジンとは

「コンテンツ・グラフ・エンジン」とは、Appleは「データをその場でインテリジェントに変換」する機能だと説明しています。
分かりやすく言い換えると、高度な自動型変換(キャスト・動的型付け)機能と、画像のフォーマット変換機能のことです。
なおコンテンツ・グラフ・エンジンの動作は、iOSの標準機能とショートカットApp独自のContentKitフレームワークで実現されています。

例えば、電話番号型変数しか入力できないアクションがあるとします。
このアクションに連絡先型変数を入力した場合、C言語などの静的型付け言語の場合は、型の不整合でエラーになったり、メモリの記録内容を破壊したりします。
しかしショートカットAppは、型が不整合であるときはコンテンツ・グラフ・エンジンが作動し、連絡先型変数の中からプロパティ「電話番号」の値(電話番号型変数)を取り出し、アクションにそれを渡します。

なおデータ型の性質上、コンテンツ・グラフ・エンジンによる型変換を行うことができない場合は、エラーになります。
例えば「URL型変数」を「電話番号型変数」に型変換することは物理的に不可能なので、エラーになります。

また数字型変数をテキスト型変数に変換するなどの、単純な型変換も行うことができます。
ただし、リスト形式の変数のプロパティの値が空(Nil)の場合、そこだけブール値型変数の値「いいえ」に変換されてしまうことがあります。

ショートカットAppには、このコンテンツ・グラフ・エンジンという仕組みがあるため、型変換のみを目的としたアクションは存在しません。
変数の出力値を任意の型に変換する方法については、後述します。

変数のプロパティ

変数の中には値だけではなく、別の変数も入れることができます。
これが、一般にいう「変数」と、「クラス」(ショートカットAppでいうところの「変数」)の大きな違いです。
変数の中に別の変数を入れることができる機能は、オブジェクト指向プログラミングでは「継承」と呼ばれ、スーパークラス(親クラス)に継承された変数は「サブクラス」(子クラス)と呼ばれます。
変数の構造は、アクション「コンテンツグラフを表示」で確認することができます。
なおショートカットAppの内部では、一部のサブクラスはスーパークラスの要素の一部として扱われていることがあります。

例えば、「Podcast型変数」は以下のようなプロパティを持っています。

※参考までに、ショートカットAppの内部では、プロパティ「作成日」・「最終変更日」の値はNSDateクラス、プロパティ「名前」の値はNSStringクラスになっているようです。

型変換

出力値のデータ型を変換する方法

変数のデータ型を変えることはできませんが、値の出力時にデータ型を変更することはできます。
変更方法は次の通りです。

  1. 使いたい場所に変数を置き、その変数をタップ。
  2. 画面下部に変数エディタのコントロールが表示されるので、「○○として >」をタップ。
  3. データ型を指定する「種類」が表示されるので、そこで目的のデータ型を指定。
  4. 完了」をタップ。

なお型変換が物理的に不可能な場合は、実行時にエラーになります。

プロパティを選択するピッカー
写真メディア型変数「最新の写真」のプロパティを選択するピッカー
データ型を選択するピッカー
データ型を選択するピッカー

条件は限られますが、アクション「入力から○○を取得」でも型変換を行うことができます。
またアクション「次の種類のファイルを取得」でも、使い方によっては型変換を行うことができます。
ただし、iOSの内部実装について理解する必要がある特殊なアクションであるため、当アクションリファレンスでは詳述はしません。

特定のプロパティの値を取得する方法

目的によっては、変数の中の特定のプロパティの値だけを取得したい場合があります。
指定方法は次の通りです。
なお日付型変数・間隔型変数の出力値の表記形式の指定も、同様の方法で指定します。
日付の表記形式については、「日時の形式」のページを参照してください。

  1. 使いたい場所に変数を置き、その変数をタップ。
  2. 画面下部に変数エディタのコントロールが表示されるので、目的のプロパティ名を指定。
  3. 完了」をタップ。
プロパティを選択するピッカー
写真メディア型変数「最新の写真」のプロパティを選択するピッカー