アプリでサーバーにリクエストを送信しました。そして、投稿されたデータは次のようになります。サーバー側は、すべてのパラメーターがゼロであっても待機しています。しかし、辞書にnil値を追加できませんでした。
var postDict = Dictionary<String,AnyObject>
postDict[pass]=123
postDict[name]="ALi"
postDict[surname]=nil // dictionary still has only pass and name variables.
辞書にnil値を追加する方法はありますか?
nil
値をSwift辞書に追加するには?
基本的に、他の値を辞書に追加するのと同じ方法。最初に、値を保持できる値タイプを持つ辞書が必要です。タイプAnyObject
に値nil
を含めることはできません。したがって、タイプ[String : AnyObject]
の辞書には、値nil
を含めることはできません。
[String : AnyObject?]
のようなオプションのタイプである値タイプを持つディクショナリがある場合、nil
値を保持できます。例えば、
let x : [String : AnyObject?] = ["foo" : nil]
添え字構文を使用して要素を割り当てる場合、少し注意が必要です。タイプ[K:V]
の添え字のタイプはV?
であることに注意してください。オプションは、取得したときに、そのキーのエントリがあるかどうかを示し、ある場合は値を示します。それを入れると、値を設定するか、エントリを削除することができます(nil
を割り当てることにより)。
つまり、タイプが[String : AnyObject?]
の辞書の場合、添え字のタイプはAnyObject??
です。繰り返しになりますが、添え字に値を入力すると、オプションの「外側」を使用して値を設定したり、エントリを削除したりできます。単に書いたら
x["foo"] = nil
コンパイラは、AnyObject??
型のnil
(外部オプション)であると推測します。これは、キー"foo"
のエントリを削除することを意味します。
setキーの値"foo"
をAnyObject?
値nil
にするには、_nil
以外の外部オプションを渡す必要があります。値nil
の内部オプション(タイプAnyObject?
)を含む。これを行うには、次のことができます
let v : AnyObject? = nil
x["foo"] = v
または
x["foo"] = nil as AnyObject?
AnyObject?
ではなくAnyObject??
のnil
があることを示すもの。
updateValue
メソッドを使用できます。
postDict.updateValue(nil, forKey: surname)
ここに記載 のように、辞書のキーにnil
を設定することは、要素自体を削除することを意味します。
たとえば、null
への変換時にJSON
が必要な場合は、NSNull()
を使用できます。
var postDict = Dictionary<String,AnyObject>()
postDict["pass"]=123
postDict["name"]="ALi"
postDict["surname"]=NSNull()
let jsonData = NSJSONSerialization.dataWithJSONObject(postDict, options: NSJSONWritingOptions.allZeros, error: nil)!
let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)!
// -> {"pass":123,"surname":null,"name":"ALi"}
Optional
タイプを使用できます
var postDict = ["pass": 123, "name": "ALi", "surname": Optional()]
postDict[surname] = Optional<AnyObject>(nil)
var dict = [Int:Int?]()
dict[0] = (Int?).none // <--- sets to value nil
dict[0] = nil // <-- removes
dict[0] = .none // <-- same as previous, but more expressive
switch dict[0] {
case .none:
Swift.print("Value does not exist")
case .some(let value):
if let value = value {
Swift.print("Value exists and is", value)
} else {
Swift.print("Value exists and is nil")
}
}
nil
値をSwiftの辞書に追加するには、辞書の値がOptional
型である必要があります。
Person
クラスを考えます:
_class Person {
let name: String
weak var spouse: Person?
init(name: String, spouse: Person?) {
self.name = name
self.spouse = spouse
}
}
_
Person
タイプのインスタンスには、name
およびオプションのspouse
を含めることができます。 2つのインスタンスを作成し、最初のインスタンスを辞書に追加します。
_let p1 = Person(name: "John", spouse: nil)
let p2 = Person(name: "Doe", spouse: p1)
p1.spouse = p2
var people = [p1.name: p1.spouse]
_
この辞書(people
と呼ばれる)は、名前を配偶者にマップし、タイプは_[String: Person?]
_です。これで、Optional
型の値を持つ辞書が作成されました:_Person?
_。
キー_p1.name
_の値をnil
に更新するには、Dictionary
タイプでupdateValue(_: forKey:)
メソッドを使用します。
_people.updateValue(nil, forKey: p1.name)
people[p1.name]
_
キー_p1.name
_の値はnil
になりました。この場合、updateValue(_: forKey:)
を使用することは、スローアウェイインスタンスを作成し、nil
に設定し、そのインスタンスをディクショナリのキーに割り当てる必要がないため、もう少し簡単です。
NB:投稿の辞書にnull
を挿入するためのrintaroの答えを参照してください。
以下の辞書には、nil値のキーが1つあります
var dict = [String:Any?]()
dict["someKey"] = nil as Any?