Caution

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

  1. トップページ
  2. Swift入門編 - 辞書のプロパティの追加や削除について

辞書のプロパティの追加や削除について

みなさまどうも。

さて、続きまして辞書のプロパティ(要素)を使う時の注意点とか追加方法とか削除方法とかをもろもろ確認していきましょう。

まず辞書のキーとして使用できるデータ型についての確認です。

他の言語にはSwiftの辞書に該当する連想配列ってやつがいるんですが、連想配列の場合にキーとして使用できるデータ型はString型またはInt型のみ、となっている場合がほとんどです。

しかし、Swiftの場合は「Hashableというプロトコルに適合した型は辞書のキーとして使用できる」という構造になっているため、文字列や数値以外のものもキーとして指定することができます。

例えば真偽値(trueとfalse)をキーとすることもできちゃいます。

let d: [Bool: String] = [true: "初音ミク"] // こんなのもOKです。

ただ、「辞書をString型またはInt型以外の型をキーとして実装しなくてはいけないパターン」って存在しないような気がするので辞書のキーとして使う型はString型またはInt型としてしまうのが無難かもしれません。まあ、これは著者の考えなので必要とあれば使ってしまってOKです。状況に合わせて使い分けてしまって下さい。

では続いて定義した辞書にプロパティ(要素)を追加してみましょう。以下のサンプルを見てみて下さい。

var d = ["staff0": "初音ミク"]

d["staff1"] = "IA"

print(d) // 『["staff0": "初音ミク", "staff1": "IA"]』と出力されます。

上記のサンプルの『d["staff1"] = "IA"』ってところに注目ですね。辞書に新しくプロパティ(要素)を追加する場合はこのように『辞書名[キー] = 値』という形で追加します。

そんでもって辞書のプロパティ(要素)を削除するにはこのようにします。

var d = ["staff0": "初音ミク"]

d["staff1"] = "IA"

print(d) // 『["staff0": "初音ミク", "staff1": "IA"]』と出力されます。

d["staff1"] = nil // 『nil』を渡してあげることで要素を削除できます。

print(d) // 『["staff0": "初音ミク"]』と出力されます。

上記のサンプルの『d["staff1"] = nil』というところに注目ですね。このように『nil』を代入、つまり『辞書名[キー] = nil』と記述すればそのプロパティ(要素)を削除することができます。この形は覚えておいて下さい。

あと『let』で宣言した辞書は変更不可になっちゃいますので、あとから変更する必要のある辞書は『var』で宣言するようにして下さいね。間違いやすいので要注意です。

※『nil』については次の記事で解説します。

辞書も配列と同じく『辞書名.count』と記述することで、その辞書が保持しているプロパティの個数を取得することができます。

let d = [
    0: "初音ミク",
    1: "IA"
]

print(d.count) // 数値『2』が出力されます。

『.count』の使用頻度はかなり高いので覚えておくようにして下さい。

「辞書のキーにInt型を指定した場合って通常の配列と何か違うの?」って思った方いらっしゃると思いますので通常の配列とInt型をキーとする辞書をちょっと見比べてみましょう。

まず適当に定義してみます。

let d: [Int: String] = [0: "初音ミク"] // キーをInt型にした辞書を生成します。

let a: [String] = ["初音ミク"] // 配列を生成します。

辞書『d』と配列『a』の最初のデータを出力するとするとこうなります。

var d: [Int: String] = [0: "初音ミク"]

var a: [String] = ["初音ミク"]

print(d[0]) // 『Optional("初音ミク")』が出力されます。

print(a[0]) // 『初音ミク』が出力されます。

※上記のサンプルでは『Optional("初音ミク")』と出力されていますが、これについては次の記事で解説します。

なんだか同じように見えますね。

しかしInt型をキーとする辞書と通常の配列には大きく違うところがあり、通常の配列の場合は「連番の数値で管理」、Int型をキーとする辞書は「連番じゃない数値で管理」、という感じになります。

ちょっと試してみましょう。配列に新しい値を追加してみます。『+=』を使ってるというところに注目です。

var d: [Int: String] = [0: "初音ミク"]

var a: [String] = ["初音ミク"]

print(d[0]) // 『Optional("初音ミク")』が出力されます。

print(a[0]) // 『初音ミク』が出力されます。

a += ["IA"]

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

Swiftの配列は『a[1] = "IA"』といったように「インデックス番号を指定しつつ新しい要素を追加する」という文法が許されていません。なので以下のような記述をするとエラーです。

var d: [Int: String] = [0: "初音ミク"]

var a: [String] = ["初音ミク"]

print(d[0]) // 『Optional("初音ミク")』が出力されます。

print(a[0]) // 『初音ミク』が出力されます。

a[0] = "Lily" // これはすでに存在している要素の上書きなのでOKです。

a[1] = "IA" // これは存在していない要素を新しく作ろうとしているのでエラーです。

『.insert()』を使用しても同じです。要素数以上のところに挿入しようとするとエラーになっちゃいます。

var d: [Int: String] = [0: "初音ミク"]

var a: [String] = ["初音ミク"]

print(d[0]) // 『初音ミク』が出力されます。

print(a[0]) // 『初音ミク』が出力されます。

a.insert("IA", at: 2) // エラーです。現在の最大のインデックス番号以上のところに挿入することはできません。

こんな感じで配列に新しい要素を追加するには『+=』を使用する形になります。

これはつまり通常の配列に新しい要素を追加する際は必ず現在の最大のインデックス番号に1を加算した数値からの連番で管理されるということになります。

それと比べてInt型をキーとする辞書の場合は「番号をかっ飛ばして保存することができる」という実装が可能です。こんな感じですね。

var d: [Int: String] = [0: "初音ミク"]

var a: [String] = ["初音ミク"]

print(d[0]) // 『Optional("初音ミク")』が出力されます。

print(a[0]) // 『初音ミク』が出力されます。

a += ["IA"]

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

d[2] = "IA" // このように連番を気にせず保存できます。

print(d[2]) // 『Optional("IA")』が出力されます。

ちょっと頭がこんがらがってしまいがちですが、通常の配列とInt型をキーとする辞書の違いはこんな感じになります。目的に合わせて使い分けてしまって下さい。

そして、「宣言の時にデータ型を指定している」というわけなので、お察しの良い方はお気づきかと思いますが、配列と同じく辞書も基本的に同じ型のキーと同じ型の値しか収めることはできません。

var d: [String: String] = ["staff" : "初音ミク"]

d["staff1"] = true // エラーです。辞書『d』は 『[String: String]』で定義されているため『true』を代入することはできません。

昨今のプログラム言語ではデータ型をそんなに気にしなくても実装できる様になっていることが多いのですが、Swiftはデータ型に非常に厳密です。ここ間違いやすいので注意して下さいね。

というわけで辞書の注意点とかプロパティの追加と削除とかについてはこんな感じになります。ちょっと色々とややこしい感じですが大丈夫そうでしょうか。

さて、これまでのサンプルをご自身の環境で色々と試して頂いた方はちょっと気になる点があったと思います。以下のサンプルをちょっと見てみて下さい。

let d = ["staff": "初音ミク"]

print(d["staff"]) // 『初音ミク』と出力されると思いきや『Optional("初音ミク")』と出力されちゃいます。

なにやら『Optional("初音ミク")』ってなっちゃってますね。続いての記事ではこの『Optional』とかについてやっていきましょう。ではこの辺で失礼いたします。

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

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

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

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