[Swift コレクションを表す型 第2回] Dictionary型

f:id:KAFAppFactory:20200731155049j:plain

Swiftのコレクションを表す型、第2回 Dictionary型についてまとめていきます。

Directionary型はその名の通り、辞書を表します。
ただ、ここでいう辞書とはキーと値のペアを持つコレクションであり、キーをもとに値にアクセスする用途になります。
前回のArray型と違って順序関係はありません。
キーはアクセス対象の識別に使用されるので一意でなければなりませんが、値は他のものと重複しても構いません。

本記事は「Swift実践入門」を参考にしています。

gihyo.jp

辞書リテラル

Directionary型は、["key1":"value1", "key2":"value2"]のように辞書リテラルで表現できます。
上記の例のように、keyvalue:でペアにして、それらのペア要素を, 区切りで[]に列挙します。

型推論について

Dictionaryの中のkeyvalueはそれぞれキーの型や値から型推論されます。

例 )

let Dictionary = ["tanaka":175, "satou":170]

上記の例ではキーはString型、値はInt型と推論されます。

要素が一つもない場合やキーや値に複数の型が混在する場合は、辞書リテラルから型が推論できない場合があります。 このような場合は下記の例のように型をこちらから明示してあげる必要があります。

例 )

let Dictionary : [String: Int] = [:]

キーと値にできる型

実はDictionaryのキーに指定できる型は制限があります。キーには一意性が必要になるので、Hashableプロトコルに準拠している必要があります。ということでHashableプロトコルに準拠しているInt型やString型は使用できますが、例えば、Array型のようなHashableプロトコルに準拠していない型は使用できません。

一方でvalueには型の指定はありません。好きな型を入れることができます。

例えば、要素としてArray型を入れる...なんてこともできちゃいます。

例 )

let Array = ["多い" : [1000, 2000, 3000], "少ない": [1, 2, 3]]

要素へのアクセスや操作

要素へのアクセス

まず値へのアクセスについて説明します。アクセスにはサブスクリプトを使用しますが、引数にはkey型の値を指定します。

例 )

let access = ["key":1]
let access1 = access["key"]

Dictionary型では、サブスクリプトで存在しない値にアクセスした場合、nilを返します。
復習ですが、nilを許容するのはOptional型でしたよね?
ということで返却される値はOptional型となります。
以下の例で確認しましょう!!

例 )

let test = ["key1" : 100, "key2" : 2]
print(test["key1"])
print(test["key3"])

実行結果

Optional(100)
nil

値の操作

値の追加、更新、削除にもサブスクリプトを使用します。 サブスクリプトの引数にKey型の値を指定し、=を用いて新しい値を設定します。 Array型と違って一つの演算子で追加、更新、削除が行えるところがミソですね。

例 )

// 追加
var dictionary = ["key1" : 1]
dictionary["key2"] = 2
// ["key1" : 1, "key2" : 2]となる。

// 更新
var dictionary = ["key"1 : 1]
dictionary["key1"] = 2
// ["key1" : 2]となる。

// 削除
var dictionary = ["key" : 1, "key2" : 2]
dictionary["key2"] = nil
// ["key1" : 1]となる。

終わりに

今回、Swiftのコレクションを表す型、第2回 Dictionary型についてまとめてました。Dictionaryはkeyに対する値のペアでデータを管理できますので便利ですね!値の操作は=演算子のみで覚えるのは簡単ですが、代入をミスったりしそうで気をつけなければと思いました。。笑