Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Swift入門編 - 配列とは

配列とは

みなさまどうも。

さて、前回は変数とか定数とかの使い方を確認しましたので、今回は『配列』(はいれつ)ってやつをやっていきましょう。

まず『配列』とはなにか、というとデータを連番で管理するような感じのもので、まあとどのつまり『連番が付けられた変数(定数)の集合体』って感じのシロモノになります。

「変数(定数)がグループ化されている」ということと「連番が付けられている」っていうのがポイントですね。『配列』は『添字配列』(そえじはいれつ)なんて呼ばれることもあります。

なんのこっちゃってお話なんですが、例えば社員さんの名前を保存してその人数を出力したい、といった処理を構築する場合は社員さんの名前が入ったデータをまとめてしまえればスマートな処理が構築できそうですよね。そんな時に『配列』が使用されます。

まあ言葉で説明するよりも見てもらったほうが早いと思いますので早速定義してみましょう。

Swiftで『配列』を初期化とかをしないで宣言だけ行うパターンはいくつかあり、まず以下のように『配列名: [データ型]』って感じで宣言する方法があります。

var arr: [Int] // 配列『arr』を宣言します。

変数と定数を宣言するときに『var n: Int』って感じで宣言しましたよね。その型の部分を『[]』で包んであげる形になります。

そんでもって『配列名: Array<型>』っていう記法もあります。

var arr: Array<Int>

これホントにどっちでもOKです。ただ『配列名: [型]』の方が記述が楽なので多数派な気がします。違ったらすみません。

さて、こんな感じで宣言だけを行うこともできるのですが、この記法はちょっと問題があり、宣言のみを行った『配列』にアクセスしようとしたりするとエラーが出ます。

var arr: [Int] // 配列『arr』を宣言します。

print(arr) // エラーです。

変数とか定数の時と同じですね。

なので『配列』を宣言だけ行うことはしないで初期化しつつ定義する、という手法が良く使われます。こちらもいくつか記法があり、まずはこんな形を紹介しておきます。

var arr = [Int]()

『[型]』に『()』を付けていますね。これで初期化しつつ『配列』を定義することができます。

そして『Array<型>』に『()』を付けてもOKです。

var arr = Array<Int>()

『[型]()』も『Array<型>()』もどっち使ってもOKですが、こちらも『[型]()』の方が多数派な気がします。

この定義方法で間違えないようにしてほしいのですが、これは『配列』のインスタンスというものを代入している形なので『=』の右側に『[型]()』とかを記述する形になります。『配列名: [型]()』ではないのでご注意です。

ちょっとごっちゃになりそうなところなんで気をつけましょう。

var arr: [Int]() // これはエラーです。『var arr: [Int]()』ではなく『var arr = [Int]()』が正しいです。定義だけ行う場合は『var arr: [Int]』となります。

そして『[]』の中に代入したいそれぞれの値を書いて、それを代入するという形でも『配列』を定義することもできます。

var arr: [Int] = [1, 2, 3] // こんな感じでもOKです。この『[]』でラップした記法は『配列リテラル』とか呼ばれたり呼ばれなかったりします。

// イメージとしては以下と同じような感じです。
var s = "初音ミク" // 文字列リテラル『初音ミク』を初期値として初期化することでString型の変数『s』が定義できます。

これはリテラルで記述したパターンになりますね。上記の『[]』を使った記法は『"』を使った文字列リテラルと同じような感じのシロモノで、『配列リテラル』とか呼ばれます。結構参考書とかに出てくるので覚えておいて下さい。

そして、上記の『[1, 2, 3]』は数値『1』と数値『2』と数値『3』を配列『arr』に突っ込んでる感じになり、それぞれの値の区切りは『,』を使用します。

ちょっと注意点ですが、他の言語では『[1, 2, 3,]』といったように最後の『,』を記述するとエラーになったりすることがあります。しかし、Swiftの場合は記述しちゃってもOKです。

var arr = [1, 2, 3,] // 最後の『,』はあってもなくてもOKです。 

そんでもって、変数とか定数と同じく『配列リテラル』で1つ以上の要素を記述した『配列』を初期値として初期化した場合は型の指定を省略することができます。

var arr = [1, 2, 3] // こんな感じで『配列リテラル』で1つ以上の要素を渡した場合は『var arr  : [Int]』とかの型の指定はしなくてもOKです。

こちらも変数とか定数とかの時と同じですね。

そして先程紹介した宣言だけ行なった『配列』にアクセスするとエラーになる、という問題も『配列リテラル』を使えば回避することができます。以下のやつですね。

var arr: [Int] // 配列『arr』を宣言します。

print(arr) // エラーです。

このエラーは『空の配列』を渡してあげれば回避できるので『[]』を代入してしまいましょう。

var arr: [Int] // 配列『arr』を宣言します。

arr = [] // 空の配列を渡してあげます。

print(arr) // 『[]』と出力されます。

なので『配列』の宣言だけ行いたい、といった場合は以下のように初期値に『[]』を渡しつつ初期化してあげるという手法がよく使われます。

var arr: [Int] = [] // 配列『arr』を宣言だけ行う場合は『[]』を渡して初期化してあげます。

print(arr) // 『[]』と出力されます。

この手法を使う場合の注意点ですが、『空の配列』を渡して初期化するときの型の指定は必須になります。

var arr = [] // エラーです。

ここ間違いやすいので注意して下さい。以下のような感じで型を指定しちゃえばOKです。

var arr: [Int] = [] // OKです。

var arr1 = [0, 1] // このように型のはっきりした要素を渡してあげれば型の指定はいらないです。

変数とか配列とかもろもろを同じ識別子で再定義するとエラーになっちゃうので気をつけて下さい。これは他の言語でもそんな感じになりますね。

var s = ""

var s = 1 // エラーです。

というわけで定義に関するところはこんな感じですね。

Swiftの『配列』は最近の言語と比べるとやや難しめで覚えることが沢山あり、めっちゃ大変かと思いますがここまでは大丈夫そうでしょうか。

続いて『配列』の代入方法とかアクセス方法についてみていきましょう。

先程『[1, 2, 3]』を配列『arr』に代入しました。これらの値を取り出すときは以下のようにします。

var arr = [1, 2, 3]

print(arr[0])

『print()』の『()』の中の『arr[0]』って部分に注目です。

上記のように配列名の隣に『[]』を書いて、その中に取り出したい番号を記述する感じになります。

上記の場合は『arr[0]』って書いてありますよね。なので配列『arr』の中の0番目の要素が出力されます。

さて、ここで「0番目ってなんやねん!」って思った方いらっしゃると思います。

ちょっと慣れないと大変かもですが、プログラムの世界で連番を数えるときは『0』から数え始めます。これはほぼ全てのプログラム言語共通の事柄なんで、バシッと覚えてしまって下さい。

というわけで色々と記述してみるとこんな感じになります。アクセスするときも代入するときも『[]』の中に番号を書いてこにょこにょするっていうのは変わりません。

var arr = [1, 2, 3]

print(arr[0]) // 配列『arr』の0番目を出力します。1です。

arr[1] = 100 // 配列『arr』の1番めの要素を数値『100』に変更します。

print(arr[1]) // 数値『100』が出力されます。

let n = arr[1] + arr[2] // 配列『arr』の1番目と2番目を加算して定数『n』に突っ込みます。

print(n) // 数値『103』が出力されます。

ここでちょいと呼び名の確認をしたいのですが、『配列』をこにょこにょするときに『[]』の中に書く番号には名前が付いていて、『インデックス』とか『インデックス番号』とか『配列番号』とか呼ばれます。『[1]』の場合だと『1』が『インデックス』になります。

そんでもって『配列』に収まっているひとつひとつの値とかを『要素』と呼びます。良く使われるので覚えておいて下さい。

さて、ではこのまま『配列』を使用するときの注意点とかもろもろを確認しておきましょう。

ちょいとこれまで紹介した『配列』の宣言とか定義の方法を再度思い出してほしいのですが、そのときに何かしらの形でデータ型の指定をしていましたよね。

お察しのよい方はすでにそんな予感がしてるかと思いますが、Swiftの『配列』は基本的に同じ型の要素しか入れられません

ちょっと試してみましょう。適当にInt型な『配列』を作ってみます。

var arr = [0, 1]

配列『arr』に『[0, 1]』を代入したのでこの配列『arr』はInt型になっています。これの0番目の要素に文字列を代入してみましょう。そうするとこうなります。

var arr = [0, 1]

arr[0] = "" // エラーです。

エラーですね。以下のような感じで違う型を『配列リテラル』で定義する場合も怒られちゃいます。

var arr = [0, "初音ミク"] // こういうのもダメだったりします。

こんな感じで基本的に違う型なものは入りません。

しかし、『配列』に違う型のものを突っ込みたいというロマンチックな時もありますよね。

そんな悩める皆様のためにSwiftでは『Any型』というちょっとフリーダムなやつが用意されています。使い方はこんな感じです。

var arr: [Any] = [0, 3.14, "IA"]

こんな感じで結構なんでも入るようになります。ただし、先程のように『配列リテラル』を使って初期化するときは『: [Any]』を添えて型をちゃんと教えてあげる必要があります。

var arr: [Any] = [0, 3.14, "IA"] // これはOKです。
var arr1 = [0, 3.14, "IA"] // これはダメです。『: [Any]』が必要だったりします。

Swiftでは『[0, 1]』といったように各要素の型が同じで型を確実に特定できる場合はその型を推測して『配列』とかを生成してくれるのですが、『Any型』の場合はNGです。ここ間違いやすいので要注意です。

そして『Any型』で作った配列の各要素を使って演算する場合は『キャスト』というものを行ったりしないと演算できません。ちょっと試してみましょう。以下はInt型の『配列』を定義してそれを演算してみた例です。

var arr = [0, 1, 2]

print(arr[0] + 1) // 数値『1』が出力されます。

しかし、これを『Any型』にするとこんな感じになります。

var arr: [Any] = [0, 1, 2]

print(arr[0] + 1) // エラーです。

エラーになっちゃいましたね。

Swiftでは基本的に型の違うもの同士の演算はNGだったりするので、上記のような記述をするとエラーになります。

これを演算させる場合は『as!』とかを使って一度『キャスト』してあげる必要があります。こんな感じですね。

var arr: [Any] = [0, 1, 2]

var n = arr[0] as! Int // キャストします。

print(n + 1) // 数値『1』が出力されます。

ちょっと『キャスト』とか『as!』とかについては前提知識が色々と必要なので先の記事で解説しますが、「違う型同士の演算はできない」ということだけ覚えておきましょう。

さて、では最後に、『var』ではなく『let』を使用すると値を変更できない『配列』となりますのでそちらも見ていきます。こんな感じですね。

let arr = [0, 1]

こんな感じで『let』を使用することで中身の書き換えができなくなります。

let arr = [0, 1]

arr[0] = 3 // エラーです。

Swift以外の他の言語では以下のように『配列』を変数とかに代入したりすると、「変数名」ではなく「配列名」と呼び名が変わるのが一般的です。以下はJavaScriptの例ですね。

var arr = [0, 1]; // 配列を代入しているので『arr』は変数名ではなく配列名と呼ばれたりします。

しかし、Swiftでは配列を代入しようと何を代入しようと変数という呼び名は変化せず、「変数に配列を代入する」といった言い方をするのが一般的です。

まあ、ただの言葉の言い回しなんですが頭の隅にでも置いておくと良いかもしれません。

ちなみに当サイトでは『配列名』とかを使って解説していますのでその辺は適宜ご対応下さい。

というわけで『配列』に関する基本的なところはこんな感じですね。大分長くなっちゃいましたがここまでお読みいただいた方はめっちゃお疲れ様でした。

次の記事では『配列』の要素を追加したり削除したりといったところをやっていきましょう。

ではではこの辺で。またお会いしましょう。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。