プログラミングの入門のための学習には、いろいろなアプローチがありますが、その過程で、共通して最初の関門と言われているのが「配列(はいれつ)」です。この連載でもすでに登場した「変数」は、なんらかの値に名前をつけて記憶しておき、あとからその名前を指定して値を取り出したり、あるいは値を変更したりできるものでした。この変数は、概念としては似たものが小学校の算数にも登場することもあり、それほどわかりにくくはないでしょう。それに対して配列は、変数に記録できるデータの一種なのですが、コンピューターならではの考え方で、現実世界には似たものがないため、わかりにくいのかもしれません。
入門者にとって、配列を学ぶ際の最初の疑問は、なぜそういうものが必要なのかということでしょうか。それに対する答えを最初に言ってしまいましょう。配列の存在意義の最も大きなものは、ずばり繰り返し処理に対応できる変数として機能することです。もし配列なかったら、コンピューターの繰り返し処理は、あまり役に立たないものとなってしまいます。ひいては、コンピューター自体の存在意義も薄れてしまうでしょう。
行列に似ている?「配列」
現実世界には、あまり配列に似ているものはないと言いましたが、数学の世界で最も近いものを挙げれば、名前も似ている「行列(ぎょうれつ)」があります。行列という言葉は、見たとおり「行」と「列」を組み合わせたもので、要するに行方向(横)と列方向(縦)に数字などがマス目のように縦と横に並んでいます。英語では「matrix」(マトリクス)と言いますが、そのほうがイメージが湧くという人もいるかもしれません。ちなみにプログラミングの配列は「Array」(アレイ)と言い、元は「整列したもの」といった意味です。
ここで行列について詳しく述べるつもりはありませんが、行列には3次元の座標変換をまとめて一発で表現できるという大きな特徴があり、コンピューターグラフィックでも盛んに利用されています。その際には、数学的な行列を配列を使って表現するのです。
行列は、通常は行×列の2次元ですが、特別な場合として「行ベクトル」や「列ベクトル」というものもあります。これらは、それぞれ1行、あるいは1列しかない1次元の行列と考えられます。単純な1次元配列の構造は、それらによく似ています。
行列の場合には、その構造によって用途が決まり、中の要素も位置によって意味が決まってくることが多いのですが、配列では特にそのようなことはありません。どのような意味を持たせようと、どのように使おうと、まったくの自由です。また3次元でも4次元でも、それ以上でも、必要ならほとんど制限なく次元を増やすこともできます。
最も単純な行列は、どちらかというと行ベクトルのように、1行に複数の要素が並んだものとなっています。要素の数は任意ですが、Swiftの場合には、1つの配列の要素の型はすべて同じでなければなりません。例えば整数型の配列では、その中の要素はすべて整数です。
適当な整数型の配列を定義して変数に代入してみましょう。配列は、複数の要素を大カッコ(またはカギカッコ)[]でくくり、要素同士はカンマ(,)で区切って定義することができます。
var ar1 = [1, 7, 2, 12, 5]
これはひと目見ればわかるとおり、整数型の5つの数値を要素とする配列です。これを1つの変数ar1に代入していることからもわかるように、配列はまとめて1つの「値」として扱えます。print()で表示すると、中の要素をまとめて確認できます。
配列の中から要素を1つずつ取り出すこともできます。その際は、配列の中の何番目の要素なのかを指示するインデックス(添え字)を使います。1つ注意を要するのは、このインデックスは0から始まるということです。つまり最初の要素のインデックスは0、その次の要素は1になります。現実世界の常識とはちょっと違うのです。
例えば上のar1の配列で、見た目では4番目の要素を取り出すためのインデックスは3です。このインデックスを、配列を表す変数名の後ろに大カッコでくくって指定します。
print(ar1[3])
この場合、見た目は4番目の要素12がコンソールに表示されます。
ここで、何か変だと思った人もいるでしょう。配列を初期化するときには、複数の配列の要素を大カッコでくくったのに、その中の要素を取り出すときにはインデックスを大カッコでくくっています。明らかに大カッコの意味が違います。しかし、これは配列とはそういうものだと理解するしかありません。現在使われている非常に多くの言語で、配列は大カッコをこのようにふたとおりに使い分けています。
最初から要素を指定せずに、空の配列を定義することもできます。その際は、そのままではその中に入る要素の型がわからないので明示的に指定します。その書き方は、Swiftではちょっとほかの言語には見当たらないような特徴的なものとなっています。
var ar2 = [Int]()
今度は、大カッコでくくるのは要素の型です。Swiftの配列は大カッコを3とおりに使うわけです。このようにして定義した配列には、あとから要素を入れることができます。
ar2 = [5, 8, 6, -2]
ar2の宣言直後と、配列を代入した後の値を、それぞれコンソールに出力してみましょう(図3)。最初は空の配列[]が、次には[5, 8, 6, -2]という配列全体が表示されることは言うまでもありません。
この連載の記事
- 第100回 SceneKitの物理現象シミュレーションとアニメーションをARKitに持ち込む
- 第99回 「物理学体」と「物理学場」を設定して物理現象をシミュレーション
- 第98回 SceneKitのノードに動きを加えるプログラム
- 第97回 いろいろな形のノードをシーンの中に配置する
- 第96回 SceneKitの基礎シーンビュー、シーン、ノードを理解する
- 第95回 現実世界の床にボールや自動車のモデルを配置する
- 第94回 ARKitを使って非現実世界との融合に備える
- 第93回 ARKitが使えるiPadを識別するプログラム
- 第92回 Swift Playgrounds 2.1での問題点をまとめて解消する
- 第91回 iPadの内蔵カメラで撮影した写真を認識するプログラム
- この連載の一覧へ