nil大特集

Swiftのnil関係の話だけを収集するプロジェクト


nilとDictionary

そもそもNSNull()について

NSNull Class ReferenceをSwift指定で見てみると
「1 Objective-C symbol hidden」
となっておりそもそも非推奨……と思ったら非推奨と断言してるページが出てこないぞ。
ObjC的には「nilを入れられないコレクションにnullっぽいものを入れたいときに使うしんぐるとんだよ☆」となっているようだ。

Dictionaryにnilを入れてみる

Dictionaryにとってnilは「その要素を消す」という操作になる。

var intAndString = Dictionary<Int, String>()

intAndString[0] = nil
println(intAndString)   //[:]
println(intAndString[0])    //nil

intAndString[0] = "zero"
println(intAndString)   //[0: zero]
println(intAndString[0])    //Optional("zero")

intAndString[0] = nil
println(intAndString)   //[:]
println(intAndString[0])    //nil

Dictionaryにnilを入れたいときは

Optional型DictionaryにしてOptional<T>を入れるのが正解。ただし返り値がOptional(Optional(なかみ))となるのでそれなりに大変かもしれない。

var intAndString = Dictionary<Int, String>()

var zero: String?
intAndString[0] = zero  //Optional<String>()の代入と同じ
println(intAndString)   //[0: nil]
println(intAndString[0])    //Optional(nil)

zero = "zero"
intAndString[0] = zero
println(intAndString)   //[0: Optional("zero")]
println(intAndString[0])    //Optional(Optional("zero"))

intAndString[0] = nil
println(intAndString)   //[:]
println(intAndString[0])    //nil

という3種類があり得ることになるので頑張るしかない。

DictionaryとNSNull

NSNullはNSNullなので他の型の代わりにDictionaryには入れられない……
こんなことしても無駄だし。

import Foundation

var hoge = Dictionary<String, NSNull>()
hoge["null"] = NSNull()
println(hoge)   //[null: <null>]

NSMutableDictionaryで型指定しなければなんでも入れ放題なのでNSNullも入る。

import Foundation

var mutableDict = NSMutableDictionary()
mutableDict[0] = NSNull()
println(mutableDict)    //{ 0 = "<null>"; }

戻る