Swift プログラミング

基本構文

Swift の Dictionary では Optional を使うと nil を値で扱えるようになっています。

少し癖がでてきますが、nil も含めてキーで値を扱えるので表現力が広がりそうです。

Swift の Dictionary で nil を扱う

Swift言語 にはnil を扱えるOptional型 があります。この型をDictionary型 の値として使うことで、Dictionary型nil の値を扱えるようになります。

値にnil を持てるDictionary型 を定義する

Dictionary型 の値にnil を持てるようにするには、Dictionary型 を定義するときに、値の型をOptional 型で指定します。

var dict = Dictionary<String,String?>()

たとえばこのようにすることで、値にString型 またはnil を扱えるDictionary型 を定義できます。

余談ですけど、キーの型をOptional型 にすることはできません。Swift言語Dictionary型 では、キーはHashableプロトコル に準拠した型である必要があり、Optional型 はそれに準拠していません。

nil を持てるDictionary型 からの値の取得

Optional型 な値を扱うDictionary型 から値を取得する方法は、通常のDictionary型 と同じですが、クセを感じるところでもあるので少し注意が必要です。


もともとDictionary型 から値を取得するときは、キーが存在しなかった場合はnil を返す性質上、定義した値の型がOptional型 でラップされて返されるようになっています。

今回のように値の型が定義時にOptional型 でラップされている場合も、それをさらにOptional型 でラップしたものが返されます。

let value:String?? = dict["a key"]

そのため、実際の値を扱うためには、取得した値をアンラップして、さらにアンラップして取り出す必要があります。

特別なことをしている訳ではないのですけど、慣れていないと煩わしさや奇妙さを感じるところかもしれません。

nil を持てるDictionary型 への値の設定方法

通常の値を設定する

値の型としてOptional型 を指定したDictionary型 への値の代入方法は、通常どおりです。

dict["key1"] = "STRING VALUE"

このように普通に文字列を代入することで、それがOptional型 にラップされて格納されます。

nil を値に設定する

値にnil を設定したい場合には、少し注意が必要です。

Swift言語 ではDictionary型 の値にnil を指定すると、指定したキーと値がDictionary型 から取り除かれるという性質があります。そのため、そのまま直接nil を代入することはできません。

Optional型 で定義した値にnil を代入するには、次のようにnil 値を持ったOptional型 を代入するようにします。

dict["key2"] = Optional<String>()

このようにすることで、nil の値を持ったキーkey2Dictionary型 に登録できます。

キーの存在を判定する

nil を持てるDictionary型 のキーの判定方法は、通常のDictionary型 と同じです。

if let value = dict["a key"] {

}

このようにすることで、指定したキーが存在している場合は条件がtrue になります。

通常、nil をそのまま代入したDictionary型 ではそれに対応するキーが消去されて、このような条件でfalse になるのですが、Optional で包んだnil が代入されていれば、それに対応するキーが存在するためtrue になります。

取得した変数value の型は、値の型として指定したString?型 になっているので、ここに、実際の値が入っているのか、それともnil なのかを判定して使って行くことになります。