今回はSwiftにおけるArray(配列)、Set(集合)、Dictionary(辞書)の違いについて。
Swiftにはデータをまとめて管理するための「コレクション型」が用意されている。
そのコレクション型の中で主要なものが本記事で扱う①Array(配列) ②Set(集合) ③Dictionary (辞書)だ。
慣れていない頃はこの3つがごちゃごちゃだったので、備忘録も兼ねてArray、Set、Dictionaryの違いについて整理したいと思う。
Contents
Array, Set, Dictionaryの違い
まずArray(配列) 、Set(集合)、Dictionary (辞書)の違いを簡単にまとめると下記の表になる。
それぞれの特徴や宣言方法を各章で確認していきたいと思う。
Array(配列)とは?
Array (配列)は、順序通りにデータを管理できるコレクションのことだ。
同じデータを何度も含めることができ(つまり、値が重複してもOK)、格納された順序が重要な場合に使われる。
特徴
Arrayの特徴は下記の通りだ。
- 順序が保障される: 要素(Array内の値のこと)の順番が保持される
- 重複が許される: 同じ値を複数回追加することが可能
- インデックスアクセス:
array[index]
形式で要素にアクセス可能
例えば、Arrayを使えば下記のようにデータを格納し、値にアクセスすることが出来る。
1 2 3 4 5 | // Arrayを宣言 let fruits = ["りんご", "バナナ", "さくらんぼ"] // 宣言したfruitsというArrayのインデックスを指定して値にアクセス print(fruits[1]) // "バナナ" と出力される |
宣言方法
Arrayの宣言は下記のように行う。
Array〜という形式ではなく、[型]
形式で指定される宣言方法がよく使われる。
慣れていない頃はこの型形式での指定がいまいちピンと来ず、Arrayが宣言されているかどうかがわかりにくかった、、、
1 2 3 4 5 6 7 8 | // 型推論による宣言(要素の型が自動推論される→この場合はString型となる) var fruits = ["Apple", "Banana", "Cherry"] // 明示的な型指定による宣言→今回はInt型を指定 var numbers: [Int] = [1, 2, 3, 4, 5] // 空の配列を宣言 var emptyArray: [String] = [] |
Arrayにおいては値の順番が保障されるので、0から始まるインデックス番号を指定して値にアクセスすることができる。
重複した値が許されるのも後述するSetとの大きな違いだ。
Set(集合)とは?
Set (集合)は、要素の順序に関係なく、重複のない要素を保持するコレクションだ。
重複を排除したい場合や、順番が不要な場合に適している。
特徴
Setの特徴は下記の通りだ。
- 順序が保障されない: 要素の順番は保証されない
- 重複が許されない: 同じ値を追加しても無視される
- インデックスでアクセスできない:順序が保障されないため、Arrayのようにインデックスでアクセスできない
- 検索が高速: Arrayよりも検索や追加が効率的
例えば、Setを宣言して出力すると、指定した順序と関係ない順序で値が出力される。
1 2 3 4 5 | //Setを宣言 var uniqueNumbers: Set = [1, 2, 3, 1] //Setを出力 print(uniqueNumbers) // [2, 3, 1] のように出力される(重複が排除され、順序がバラバラ) |
宣言方法
Setの宣言は下記のように行う。
Arrayと異なり、Set〜と明示するので
「あっSetを使っているんだな。」
と理解はしやすいはずだ。
1 2 3 4 5 6 7 8 | // 型推論による宣言(この場合は値の内容からInt型が推論される) var uniqueNumbers: Set = [1, 2, 3, 1] // 明示的な型指定(String)による宣言 var colors: Set<String> = ["Red", "Green", "Blue"] // 空のSetを宣言 var emptySet = Set<String>() |
Setの場合、順序が保障されないため、Arrayのようにインデックス番号ではアクセスできない。
そのため、containsやdescription等を利用して、値にアクセスする。
Dictionary(辞書)とは?
Dictionary(辞書) は、キーと値のペアで構成され、順序を持たないコレクションだ。
各値は一意のキーに関連付けられて、キーはDictionary内でその値を識別するために機能する。
キー自体はユニークである必要があるが、値に関しては重複しても問題がない。
特徴
Dictionaryの特徴は下記の通りだ。
- キーと値のペア: キーと値が1対1のペアとなる
- 順序が保障されない: 要素の順序は保証されない
- キーでアクセス:キーを指定することで値にアクセス可能
- 重複するキーは上書きされる: 同じキーを持つ新しい値を設定すると、古い値が上書きされる
例えば、Dictionaryを使えば下記のようにデータを格納し、値にアクセスすることが出来る。
1 2 3 4 5 | //キーと値をペアで指定 var person = ["name": "John", "age": "30"] //キーを指定して、値にアクセス(この場合はnameというキーを指定) print(person["name"]!) // "John" と出力される |
Arrayの場合は要素の順番に振られるインデックス(0から始まる番号)を指定して値にアクセスした。
一方、Dictionaryはキーを指定してアクセスするので、どの値にアクセスするかを直感的に理解しやすいと思う。
宣言方法
Dictionaryは下記のように宣言する。
SetはSet〜と明示していた一方、DictionaryはDictionary~と明示しないで宣言するのが通例だ。
キーと値のデータ型を明示的に指定する場合は、[キーの型:値の型] として指定する。
1 2 3 4 5 6 7 8 | // 型推論による宣言 var person = ["name": "John", "age": "30"] // 明示的な型指定による宣言 var scores: [String: Int] = ["Alice": 85, "Bob": 90] // 空のDictionaryを宣言 var emptyDictionary: [String: String] = [:] |
Dictionaryの場合、キーと値をそれぞれ指定しているが、それぞれのデータ型は異なっていても問題ない。
まとめ
今回はArray、Set、Dictionaryの違いについて説明した。
使い分けとしては例えば下記のような場合で使い分けるのがおすすめだ。
- Array:順序付きリストや重複を含んだデータを管理したい場合
- Set:重複を排除したユニークな値の一覧を取得したい場合
- Dictionary:設定情報やユーザープロファイルなどキーと値をペアで管理したい場合