Table of Contents
Swift における Dictionary(ディクショナリー)とは、キーと値のペアで情報を格納する配列です。
[キー1: 値1, キー2: 値2, キー3: 値3, ...]
キーに対応する値をコロン(:)で区切って書きます。ペアを区切るのはカンマ(,)です。
通常の配列(Array)とは異なり、インデックス番号がなく、順番が定義されません。
したがって、インデックス番号を使って「何番目の要素」と指定して値を取り出すことはできません。
値を取り出すには、キーを指定します。キーには数値以外の型も使うことができるので「ある単語を指定すれば別のある文章を取り出す」という使い方をすることができます。
これが現実の辞書に似ているために Dictionary という名前が付けられています。
Swift の Dictionary は、Foundation のクラス NSDictionary が元です。
Dictionary の定義方法
Swift で Dictionary を定義する正式な文法は以下の通りです。
Dictionary<Key, Value>
Keyには、キーとする要素の型を、Valueにはそのキーで呼び出される値の型を設定します。
例えば、キーも値も文字列(String)とした Dictionary を定義する場合は、以下のように書きます。
var myDictionary: Dictionary<String, String>
これが正式な定義方法ですが、ドキュメントによれば以下の略記形式による定義を使うことがオススメだそうです。
var myDictionary: [String: String]
You can also write the type of a dictionary in shorthand form as [Key: Value]. Although the two forms are functionally identical, the shorthand form is preferred and is used throughout this guide when referring to the type of a dictionary.
The Swift Programming Language (Swift 3.0.1): Collection Types
[訳]
Dictionary型は [Key: Value] のような略記形式で書くこともできます。これら2つの形式は機能的には全く同じものですが、略記形式を使うことが好まれ、またこのドキュメントでも Dictionary を書くときはこちらを使います。
後ほど値を追加するためには、Dictionary を定義するときに var を使う必要があります。
空の Dictionary を定義する
キーと値の型を設定した空の Dictionary を定義するには以下の2通りの書き方があります。
// 書き方1 var myDictionary = [Int: String]() // 書き方2 var myDictionary: [Int: String] = [:]
どちらも全く同じ意味です。
値を初期設定した Dictionary を定義する
定義と同時にキーと値のペアを設定したい場合は、以下のように書きます。
var food: [String: String] = ["apple": "りんご", "banana": "バナナ"]
複数のペアを初期値として設定したとき、キーと値の型推論が行われるため、以下のように Dictionary の型設定を省略できます。
var food = ["apple": "りんご", "banana": "バナナ"]
Dictionary のペア数を取得
通常の配列(Array)と同じように、プロパティ count にアクセスすることで、格納されている要素数が得られます。
var food: [String: String] = ["apple": "りんご", "banana": "バナナ"] print(food.count) // 2
要素が全く入っていないかどうかは isEmpty で確認できます。
if food.isEmpty { print("空です") } else { print("値が入っています") }
Dictionary にペアを追加
キーと値のペアの追加方法です。
追加方法1
var food: [String: String] = ["apple": "りんご", "banana": "バナナ"] // orange というキーで値「オレンジ」を追加 food["orange"] = "オレンジ"
追加方法2
Dictionary のメソッド updateValue(_:forKey:) を使います。
このメソッドは、もし同じキーの値があった場合、それを更新すると同時に、戻り値として更新前の古い値を返してくれます。
var food: [String: String] = ["apple": "りんご", "banana": "バナナ"] // apple というキーで値「リンゴ」を追加 // もしすでに同じキーで値があったなら、その値が戻り値として得られる if let old = food.updateValue("リンゴ", forKey: "apple") { print("更新前の値は \(old) でした") // 更新前の値は りんご でした }
もしまだその値がなければ nil が返されます。このメソッドを利用すれば、すでにそのキーで値が登録されているかの確認ができます。
キーに対応する値を呼び出す
var food: [String: String] = ["apple": "りんご", "banana": "バナナ"] print(food["apple"]) // りんご // キーが存在しなければ nil が返される print(food["orange"]) // nil
Dictionary からペアを削除
削除方法1
nil を代入すれば、そのキーと値のペアは取り除かれます。
food["apple"] = nil
削除方法2
メソッド removeValue(forKey:) を使います。このメソッドの引数には取り除かれた値が入っています。
削除しようとしたキーが存在しない場合は nil が返されます。
if let removed = food.removeValue(forKey: "apple") { print("取り除かれた値は \(removed)") } else { print("そのキーは存在しません") }
Dictionary の中身を表示
キーと値をすべて出力するには、for-inループを使って以下のように書きます。
var food: [String: String] = ["apple": "りんご", "banana": "バナナ"] for (key, value) in food { print("\(key): \(value)") } // apple: りんご // banana: バナナ
キーだけ、値だけ出力したい場合は以下のようにします。
var food: [String: String] = ["apple": "りんご", "banana": "バナナ"] // キーだけ出力 for key in food.keys { print(key) } // apple // banana // 値だけ出力 for value in food.values { print(value) } // りんご // バナナ
Dictionary のプロパティ keys にはキーのみを格納した配列が、プロパティ values には値のみを格納した配列が入っています。
しかし、これは厳密には型が LazyMapCollection なので、普通の配列としては使えません。
これを普通の配列にするには、以下のようにします。
let foodKeys = [String](food.keys) // ["apple", "banana"] let foodValues = [String](food.values) // ["りんご", "バナナ"]
Dictionary のキーについて
Dictionary のキーには、プロトコル Hashable に準拠した型を使うことができます。
具体的には String、Int、Float や Double、 Boolean です。
自作のクラスをキーとして使う場合は Hashable に準拠させる必要があります。
以上が基本的な Dictionary の使い方です。javascriptにおけるオブジェクトに似ています。
swift初心者ですが
swift3で
var food: [String: String] = [“apple”: “りんご”, “banana”: “バナナ”]
// orange というキーで値「オレンジ」を追加
food[“orange2”] = “オレンジ3”
と記述すると
food[“orange2”] = “オレンジ3″ - – – – expressions are not allowed at the top level とエラー表示されるのですが 教えて頂けませんか
記事をご覧いただきありがとうございます。
おそらく、コードをクラスの外部に記述してしまっていることが原因ではないかと考えられます。
以下のように、本来はクラスのメソッド内などに書くべき処理をクラスの外部に書いた場合にエラー「Expressions are not allowed at the top level(このコードはトップレベルでは使用できません)」が発生します。
Swiftにおけるトップレベルには、主にクラスやインポート文などを記述します。
これを、以下のようにクラスのメソッド内に移動させるとエラーは解消されます。
以下のように、プロジェクトではなく「Playground」でコードを記述する場合はメソッド内でなくとも構いません。