【Swift】配列(Array)と辞書(Dictionary)の理解


※実行環境
Swift version 4.1.2

こんにちは。

配列と辞書はswift独自の考え方ではありませんが、初心者は使い分けを理解するのに苦しむポイントなのではないかと思います。(僕がそうであったように)

今日はこの二つについて書いていきます。

配列(Array)と辞書(Dictionary)の理解

Appleの公式ドキュメントにはそれぞれこのような記載があります。

Array

  • アプリ内のデータを体系化する事が可能である
  • 一つの型に固定して保存していく事が可能である

Dictionary

  • Dictionaryはハッシュテーブルの型である。
    • 全体のコンテンツに素早くアクセス出来る
  • ハッシュテーブルにはそれぞれに当てられたKeyによってアクセス出来る

二つを比較すると分かりやすいと思います。

簡単に言えば、

配列は、番号が振られた箱の中にデータが格納されているもの

辞書は、自分でタイトルを指定した箱の中にデータが格納されているもの

という違いがあります。

特にこの番号とタイトルの違いが大きく異なると思います。
後で話しますが、これによって使い分けも決まります。

コードで見ていきましょう。

arrayPractice.playground

import UIKit

// 配列の初期化

var list : [String] = []

// 配列に値を追加

list.append = ["月","火","水","木"]

/*
初期値が予め決まっている場合は以下の方法で配列を宣言出来る。

var list : [String] = ["月","火","水","木"]

また、appendの代わりに演算子を用いて値を追加する事も可能。ただし、追加できるデータは一つまで。

list += ("金")

*/

// 配列の中身の個数を出力

print(list.count) // 6

// 配列の中身のデータを全て出力 2パターン

print(list)

for i in list {
    print(i)
}

// 上記二つ全て以下の結果
// 月,火,水,木

// 配列の特定の値を出力

print(list[1],list[2]) // 月,火

dicPractice.playground

import UIKit

// 辞書の宣言
var dic = ["mon" : "月",
           "tue" : "火",
           "wed" : "水",
           "thu" : "木",
           "fri" : "金",
           "sat" : "土"]

// 辞書内のデータにアクセス

print(dic["mon"]) // Optional("月")

// 辞書は普通に出力するとOptional型として出力するため、アンラップする必要がある。

print(dic["tue"]!) // 火

// 辞書にデータを追加
// 辞書変数に代入

dic["sun"] = "日"


//辞書内のデータを削除
// key値を指定し、nilを代入

dic["mon"] = nil

配列と辞書の使い分け

配列も辞書も複数データを保存し、自由に出し入れ出来るという点では同じですが、データ数に応じて使い分けた方が良いです。

先の画像とコードを見て分かるように、配列のデータにアクセスするためには配列が保存されている順番の数値(例えば火曜だったら"list[1]")を使わなければいけません。

配列の中身が増えていけば、何番目に何のデータが入っているか覚えるのは難しくなるでしょう。
小規模、シンプルなアプリ制作においては問題ないかもしれませんが、大規模なアプリをつくりたかったり、複数人でアプリを制作する場面においては法則性のないデータは開発に支障を与えかねません。

いちいち配列の中身を確認していく作業は時間もかかるし、ミスも起こりやすいからです。

そこで辞書の出番です。

辞書なら、key値(添字)を自分で設定できるため、法則性を持たせる事が出来ます。
上の例で言えば、"mon","thu"を見ればどんなデータがそこに入っているか分かりやすいという事です。

説明の都合上、変数名を"dic"としましたが、これを"day"や、いっそ"曜日"にしてしまうのもありでしょう。(日本語をkey値にするのはあまり聞いた事ありませんが)

※おまけ 多次元配列について

配列は入れ子にする事が可能で、似たような種類のデータをまとめる事も出来ます。
とは言え、いずれにしてもデータ数が増えてきた場合は辞書を使う事をお勧めします。

arrays.playground
import UIKit

// 多次元配列の宣言と初期化

var days : [[String]] =
[["3月1日","3月2日","3月3日","3月4日"],
["4月1日","4月2日","4月3日"]]

// [配列の指定][配列のデータの指定]によって値を取り出す。

print(days[0][1],days[1][2]) // 3月2日 4月3日