ASCII倶楽部

このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング 第7回

これがないとコンピューター自体の存在意義は薄れる

同じ名前で複数のデータを記録する配列

2016年09月26日 17時00分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 プログラミングの入門のための学習には、いろいろなアプローチがありますが、その過程で、共通して最初の関門と言われているのが「配列(はいれつ)」です。この連載でもすでに登場した「変数」は、なんらかの値に名前をつけて記憶しておき、あとからその名前を指定して値を取り出したり、あるいは値を変更したりできるものでした。この変数は、概念としては似たものが小学校の算数にも登場することもあり、それほどわかりにくくはないでしょう。それに対して配列は、変数に記録できるデータの一種なのですが、コンピューターならではの考え方で、現実世界には似たものがないため、わかりにくいのかもしれません。

 入門者にとって、配列を学ぶ際の最初の疑問は、なぜそういうものが必要なのかということでしょうか。それに対する答えを最初に言ってしまいましょう。配列の存在意義の最も大きなものは、ずばり繰り返し処理に対応できる変数として機能することです。もし配列なかったら、コンピューターの繰り返し処理は、あまり役に立たないものとなってしまいます。ひいては、コンピューター自体の存在意義も薄れてしまうでしょう。

行列に似ている?「配列」

 現実世界には、あまり配列に似ているものはないと言いましたが、数学の世界で最も近いものを挙げれば、名前も似ている「行列(ぎょうれつ)」があります。行列という言葉は、見たとおり「行」と「列」を組み合わせたもので、要するに行方向(横)と列方向(縦)に数字などがマス目のように縦と横に並んでいます。英語では「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がコンソールに表示されます。

配列の中の個々の要素は、0から始まるインデックスを、配列名の後の大カッコ[]の中に指定することで値を調べることができます

 ここで、何か変だと思った人もいるでしょう。配列を初期化するときには、複数の配列の要素を大カッコでくくったのに、その中の要素を取り出すときにはインデックスを大カッコでくくっています。明らかに大カッコの意味が違います。しかし、これは配列とはそういうものだと理解するしかありません。現在使われている非常に多くの言語で、配列は大カッコをこのようにふたとおりに使い分けています。

 最初から要素を指定せずに、空の配列を定義することもできます。その際は、そのままではその中に入る要素の型がわからないので明示的に指定します。その書き方は、Swiftではちょっとほかの言語には見当たらないような特徴的なものとなっています。

var ar2 = [Int]()

 今度は、大カッコでくくるのは要素の型です。Swiftの配列は大カッコを3とおりに使うわけです。このようにして定義した配列には、あとから要素を入れることができます。

ar2 = [5, 8, 6, -2]

 ar2の宣言直後と、配列を代入した後の値を、それぞれコンソールに出力してみましょう(図3)。最初は空の配列[]が、次には[5, 8, 6, -2]という配列全体が表示されることは言うまでもありません。

空の配列を表す変数は、大カッコ[]の中に要素の型を書き、その後ろに()を書いて宣言します

カテゴリートップへ

この連載の記事

週間ランキングTOP5

ASCII倶楽部会員によく見られてる記事はコレだ!

ASCII倶楽部の新着記事

会員専用動画の紹介も!