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
の値を持ったキーkey2
をDictionary型
に登録できます。
キーの存在を判定する
nil
を持てるDictionary型
のキーの判定方法は、通常のDictionary型
と同じです。
if let value = dict["a key"] {
}
このようにすることで、指定したキーが存在している場合は条件がtrue
になります。
通常、nil
をそのまま代入したDictionary型
ではそれに対応するキーが消去されて、このような条件でfalse
になるのですが、Optional
で包んだnil
が代入されていれば、それに対応するキーが存在するためtrue
になります。
取得した変数value
の型は、値の型として指定したString?型
になっているので、ここに、実際の値が入っているのか、それともnil
なのかを判定して使って行くことになります。