Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 757

コレクションについて〜辞書〜

$
0
0

辞書 とは

辞書とは、Dictionary<Key, Value>型というキーと値のペアを持つコレクションになります。
このコレクションは、キーを元に値にアクセスする用途で使用します。

Array<Element>型と同様に、Dictionary<Key, Value>型のKeyとValueは、
プレースホルダ型となっております。

実際にはDictionary<String, Int>型のように
Key型とValue型に具体的な型を指定して使用します。

記述の方法は、Array<Element>型と似た感じで、[Key: Value]の形で記述します。

また、カンマで区切ることによって、
配列のように複数のキーと値を変数や定数に入れることができます。

letdictonary=["a":1,"b":2]

辞書にも型推論があり、今回の場合ですと[String: Int]型になります。

要素が一つも存在しない場合や、キーや値に複数の方が混在する場合には、
型推論ができないことがあります。

そういった場合は、明示的に型を宣言する必要があります。

letdictionary:[String:Int]=[:]// 空の辞書

KeyとValueに入れれる型

配列の場合はどんな型でも配列を作ることができましたが、
Dictionary<Key, Value>型の場合は少し制限があります。

Key型には型の制限が存在し、Key型に入れることができる型は、
Hashableプロトコルに準拠している型でないといけないらしいです。
私も記事を書くまで知りませんでした・・・。

Hashableプロトコルに準拠している型はString型やInt型があります。
例えば、String型の値"a"のハッシュ値は4799450059485595655、
Int型の値1のハッシュ値は1らしいです。

現在は実行ごとに異なるハッシュ値が適用されるらしいです。 

ハッシュ値を特定の形でプログラムが理解できないと、
どの値を取り出せばいいのかわからなくなるからでしょうか。

一方で、Value型には型の制限が存在しません。
なのでこの様な辞書も作成できます。

// [String, [Int]]型   教科(キー)と点数の配列(値)の辞書leta=["math":[50,33,13,100],"English":[91,80,22,12]]

他にも、[String: [String: Int]]型なども作ることも可能です。
こんなの作るとややこしそうですね(笑)

当たり前ですが、明示的に宣言された型と異なる型を代入するとコンパイルエラーになります。

一つ目は、Value型がInt型なのに、String型が代入されてエラー
二つ目は、Key型がString型なのに、Int型が代入されてエラー

leta:[String:Int]=["a":"b"]// コンパイルエラーletb:[String:Int]=[1:2]// コンパイルエラー   

Dictionary<Key, Value>型の操作

値へのアクセス方法は配列と似ており、サブスクリプトを使い値を取り出します。

配列の場合は、サブスクリプトの引数にインデックスを指定していましたが、
辞書の場合は、サブスクリプトの引数にKey値を指定します。

letdictionary=["key":1]// [String: Int]型letvalue=dictionary["key"]// Optional(1)

Dictionary<Key,Value>型は、Array<Element>型と違い、
存在しない値にアクセスしても実行時エラーにはならずnilが返ります。

そのため、値が存在したとしても返ってくる型はOptional<Weapped>型になります。

値の更新、追加、削除

Dictionary<Key,Value>型の値の更新、追加、削除にもサブスクリプトを使用します。
サブスクリプトの引数にKey型の値を指定し、代入演算子を用いて変更を行います。

// 更新letdictionary1=["key":1]dictionary1["key"]=2dictionary1// ["key": 2]// 追加letdictionary2=["key1":1]dictionary2["key2"]=2dictionary2// ["key1": 1, "key2": 2]// 削除letdictionary3=["key":1]dictionary3["key"]=nildictionary3// [:]

配列ではいろいろなメソッドを使用しましたが、
辞書では、代入演算子で全て解決できるので楽ですね!

以上、最後までご覧いただきありがとうございました。


Viewing all articles
Browse latest Browse all 757

Trending Articles