Caution

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

  1. トップページ
  2. Swift入門編 - 辞書(Dictionary)とは

辞書(Dictionary)とは

みなさまどうもおはこんばんにちは。

さて、前回は配列について色々とお疲れ様でした。今回は『辞書』ってやつについてやっていきましょう。

Swiftの『辞書』は他の言語でいうところの『連想配列』や『ハッシュ』(hash)、または『マップ』(map)とかと呼ばれるものと大体同じような感じのものになります。

ちなみに『辞書』は英語だと『dictionary』になり、その影響でカタカナで『ディクショナリー』なんて呼ばれることも多いですね。

まず『辞書』とはどういうものか、というところから解説していきます。ちょいと添字配列(連番をインデックスとする配列)を思い出してみましょう。配列を定義するとなるとこんな感じになりますよね。

let fruits = [
    "リンゴ",
    "オレンジ",
    "グレープ"
]

そんでもって、これの各要素にアクセスするには『fruits[0]』といったように配列名の横に『[]』を置いて、その中に連番(数値)を記述してましたよね。

let fruits = [
    "リンゴ",
    "オレンジ",
    "グレープ"
]

print(fruits[0]) // 『リンゴ』が出力されます。

こんな感じで通常の配列は『連番がで管理するデータの集合体』であったわけですが、『辞書』は『独自の名前(識別子)で管理するデータの集合体』のようなイメージになります。

ちょいと以下のソースコードを見てみましょう。先程の配列に含まれている内容を『辞書』で定義してみました。

let fruits = [
    "apple": "リンゴ",
    "orange": "オレンジ",
    "grape": "グレープ"
]

上記の『リンゴ』を出力するにはこのようにします。

let fruits = [
    "apple": "リンゴ",
    "orange": "オレンジ",
    "grape": "グレープ"
]

print(fruits["apple"])

『print()』の『()』の中に注目してみましょう。『fruits["apple"]』って感じで『[]』の中に文字列『apple』が記述されていますね。

このように『[]』の中に識別子を書くことで各要素にアクセスすることができます。この『辞書名[識別子]』という形を覚えておいて下さい。

配列の時は連番のみでしか管理が出来ませんでしたが、『辞書』を使うとまた違った形での管理ができるようになるため、状況によっては非常に合理的にデータを管理できるようになります。

例えば「従業員さんの名前と電話番号を紐付けて管理したい」となった場合を考えてみましょう。通常の配列のみを使用するとこんな感じになると思います。

let staff = [
    "初音ミク",
    "IA"
]

let phoneNumber = [
    "080xxxxyyyy",
    "090xxxxyyyy"
]

配列『staff』の各要素と配列『phoneNumber』の各要素が確実に一致している、という設計にしたとしてもなんかちょっと分かりづらいですよね。

こういう場合に『辞書』を使ってみるとこんな感じになります。

let staffPhoneNumber = [
    "初音ミク": "080xxxxyyyy",
    "IA": "090xxxxyyyy"
]

いかがでしょうか。先ほどとは違ってかなり分かりやすく従業員さんのお名前と電話番号の紐付けができていると思います。これが基本的な『辞書』の使い方になりますね。

『辞書』を管理している識別子の事を『キー』(key)と呼びます。『キー』は『プロパティ名』と呼ばれることもありますね。

下記の場合だと『apple』、『orange』、『grape』がそれぞれ『キー』(プロパティ名)に該当します。

let fruits = [
    "apple": "リンゴ",
    "orange": "オレンジ",
    "grape": "グレープ"
]

そして『辞書』に保存されている各データのことを『』と呼びます。そして『キー』と『値』がセットになった各データのまとまりを『プロパティ』、または『要素』と呼びます。

上記の辞書の一番最初のデータの場合だと『キー』が『apple』、値が『リンゴ』、『apple』と『リンゴ』のまとまりが『プロパティ』(要素)に該当します。

ちょっと注意点ですが『キー』や『プロパティ』、『要素』、『プロパティ名』、『値』などの言葉は、プログラム言語や参考書や人によって呼び方が違ってしまう場合があります。

なので『キー』の事を『インデックス』、『プロパティ名』などと呼んだり、『値』の事を単純に『中身』と呼んでしまったりしても特に問題ありません。呼び方が違うだけで指してるものは同じでございます。

では続いて『辞書』の宣言とかもろもろの記述方法を確認していきましょう。まずは初期化とかを行わないで宣言だけを行うパターンです。

var d: [String: Int] // 『辞書』を宣言します。

これで『辞書』の宣言ができました。ちなみに以下の記法もOKです。

var d: Dictionary<String, Int> // 『辞書』を宣言します。

『辞書』の宣言を行う場合はこのように『辞書名: [データ型: データ型]』、または『辞書名: Dictionary<データ型, データ型>』という風に記述します。

『辞書名: Dictionary<データ型, データ型>』は長ったらしいので『辞書名: [データ型: データ型]』を使用する方が多数派かと思います。

ちょっとこんがらがってしまいがちなので配列の宣言と見比べてみましょう。

var d: [String: Int] // 『辞書』を宣言します。

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

var _d: Dictionary<String, Int> // 『辞書』を宣言します。

var _a: Array<Int> // 『配列』を宣言します。

配列の宣言の記述と見比べてみると、『辞書』の方はデータ型の指定を2つ行っていますね。ただ基本的に同じようなノリで宣言できているのが確認できたと思います。

そして配列の時と同じく、宣言のみを行った『辞書』にアクセスしようとするとエラーになります。

var d: [String: Int] // 『辞書』を宣言します。

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

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

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

なので『辞書』を生成するときは初期化してしまうのが一般的です。こちらも配列と同じですね。

『辞書』を初期化しつつ生成するにはいくつかパターンがあり、まず以下のように『[:]』を代入してしまう、という手法があります。

こちらも配列のときと同じような感じなので見比べながらやっていきましょう。

var d: [String: Int] = [:] // 『辞書』を初期化しつつ宣言します。

var a: [Int] = [] // 『配列』を初期化しつつ宣言します。

print(d) // 『[:]』が出力されます。

print(a) // 『[]』が出力されます。

配列の初期化は『[]』を代入する、という形でしたが『辞書』の初期化は『[:]』を代入していますね。

他のやり方としてはイニシャライザを使う、という方法があります。

var d = [String: Int]() // 『辞書』を初期化しつつ宣言します。

var a = [Int]() // 『配列』を初期化しつつ宣言します。

var _d = Dictionary<String, Int>() // 『辞書』を初期化しつつ宣言します。

var _a = Array<Int>() // 『配列』を初期化しつつ宣言します。

print(d) // 『[:]』が出力されます。

print(a) // 『[]』が出力されます。

※イニシャライザについては先の記事で解説します。

『[String: Int]()』、または『Dictionary<String, Int>()』を代入している形ですね。こちらも配列と同じく「代入する形」になりますので『=』と『:』を間違えないようにして下さい。

var d: [String: Int]() // エラーです。『:』ではなく『=』を使う必要があります。

var _d: Dictionary<String, Int>() // エラーです。『:』ではなく『=』を使う必要があります。

そして『[]』と『:』を使って、代入したい値をそれぞれ記述することで初期化を行うこともできます。以下のような形ですね。

ちょいと練習がてらデータ型を『[String: Int]』ではなく『[String: String]』にして初期化していますのでそこも注目してみましょう。

var d: [String: String] = [ // 『辞書』を初期化しつつ宣言します。
    "apple": "リンゴ",
    "orange": "オレンジ"
]

『:』の左側に『キー』、右側に値を記述しそれぞれの『プロパティ』(要素)の区切りは『,』を使用します。ちなみに最後の『,』は入れても入れなくてもOKです。

var d: [String: String] = [
    "apple": "リンゴ",
    "orange": "オレンジ", // 他の言語ではNGだったりしますが、Swiftの場合は最後の『,』を入れてしまってもOKです。
]

そして変数や配列などと同じように、代入するデータの型がはっきりしている場合に限り、データ型の指定は省略することができます。

var d = [ // このように『: [String: String]』を省略してもOKです。
    "apple": "リンゴ",
    "orange": "オレンジ",
]

しかし、以下のように『[:]』を使用した場合は内部的にデータ型の推測ができないため省略することはできません。

var d = [:] // これは型の推測ができないためエラーです。

そして変数や定数などと同じく、宣言を『var』で行えば変更可、『let』で行えば変更不可になります。

var d = [ // この『辞書』は変更可です。
    "apple": "リンゴ",
    "orange": "オレンジ",
]

let _d = [ // この『辞書』は変更不可です。
    "apple": "リンゴ",
    "orange": "オレンジ",
]

こちらも覚えておいて下さい。

というわけで『辞書』の概要と宣言周りについてはこんな感じになりますね。色々とルールが細かいので大変かと思いますが大丈夫そうでしょうか。

次の記事では『辞書』の要素の追加方法や削除方法などを確認していきましょう。

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

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

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

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

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