1.はじめに
今まで範囲型やストライド型などを解説してきましたが、最も基本的ともいえるであろう配列について何も触れていなかったので、今回は解説していこうと思います。
2.配列とは
説明は不要だとは思いますが、念のために説明しておきます。
配列とはArray型のことを指していて、Array型とは1つの箱の中に、いくつかのデータが格納されているもののことを言います。このように複数個の要素を格納できるデータ構造のことを、コレクションといいます。
3.コレクションの内容の変更
コレクションの内容を変更するには、それが定数ではなく、変数に代入されている必要があります。
今説明しているArray型は構造体として定義されているデータ型で、配列のインスタンスを変数に代入したり、関数に対して引数として渡したりする際、必要に応じて新しいインスタンスが作成され、元の配列の内容に影響しないように動作します。
よってコレクションを変更したい場合、元の配列の値を保持するのか、または変更してもいいのかについて、検討する必要があります。
配列に対する操作には、配列の内容を変更するものと、新しい配列を値として返すものの2パターン用意されている場合があります。
例えば内容を昇順にソートするメソッドには、配列の内容を変更する**sort()と、ソートされた配列を返すsorted()**があります。
tmp1.sort() //変数tmp1の内容が変更される
let tmp3 = tmp2.sorted() //定数tmp2の内容は変更されず、結果はtmp3に入る
4.配列の部分的な置換
配列の添字として範囲を指定しておき、別の配列を代入すると、その部分を新しい内容に置き換えることができます。置き換える前と後の要素の個数は一致していなくても大丈夫です。以下の例を確認してください。
var s = ["春", "夏", "秋", "冬"]
s[0...0] = ["春休み", "お花見", "入学式"] // s[0]はエラー
print(s) // ["春休み", "お花見", "入学式", "夏", "秋", "冬"]を出力
s[1...3] = ["梅雨", "夏休み", "プール"]
print(s) // ["春休み", "梅雨", "夏休み", "プール", "秋", "冬"]を出力
s[3...4] = [] // 削除にも使える
print(s) // ["春休み", "梅雨", "夏休み", "冬"]を出力
5.部分配列の型
先ほど例を示したように、配列の添字に範囲を指定すると部分配列を得ることができます。
片側範囲を指定することもでき、先頭から途中まで、または途中から末尾までの部分配列になります。[...]ですべての要素を含む部分列も指定できます。以下を確認してください。
var days = ["日", "月", "火", "水", "木", "金", "土"]
print(days[2...4]) // ["火", "水", "木"]
print(days[...2]) // ["日", "月", "火"]
print(days[5...]) // ["金", "土"]
print(days[...]) // すべての要素を表示
ただし、得られた部分配列の型はArray型ではなく、ArraySlice型という型になります。
ArraySlice型も同様に利用できますが、添字を使って要素にアクセスする場合には、部分配列を指定したときの範囲で利用可能になるので、注意が必要です。
つまり必ずしも0から添字が使えるわけではなく、以下の例ならば3、4のみが利用できます。
let sub = days[3..<5] // subはArrayIndex型。["水", "木"]
print(sub.count) // 3を出力(要素が3つ)
print(sub.startIndex) // 3を出力(最初の添え字は3)
print(sub[3]) // "水"を出力
print(sub[4]) // "木"を出力
ここでArray型が必要になったときに、ArraySlice型からArray型を得ることができます。
print(sub[3]) // subはArraySlice型("水"を出力)
let subarray = [String](sub) // Array<String>のイニシャライザ
print(subarray[0]) // 添字が0からになる("水"を出力)
6.配列同士の比較
配列同士を比較するために、「==」と「!=」を利用することができます。
「==」は、2つの配列の要素数が等しく、先頭から順番に対応する要素がそれぞれ等しいときにのみ真になります。以下の例を見てください。
let a = [1, 2]
let b = [2, 1]
a == b // false
a + [1] == [1] + b // true([1, 2, 1]が構成されたため)
7.おわりに
応用的な部分にはあまり触れられていませんが、今回は様々な言語でとても中心的な要素となる、配列について解説しました。
利用する機会はすごく多いと思うので、基本的な活用方法などはきっちりと押さえておきましょう。