web-dev-qa-db-ja.com

nil値をSwift辞書に追加するには?

アプリでサーバーにリクエストを送信しました。そして、投稿されたデータは次のようになります。サーバー側は、すべてのパラメーターがゼロであっても待機しています。しかし、辞書にnil値を追加できませんでした。

 var postDict = Dictionary<String,AnyObject>
 postDict[pass]=123
 postDict[name]="ALi"
 postDict[surname]=nil // dictionary still has only pass and name variables.

辞書にnil値を追加する方法はありますか?

60
yatanadam

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があることを示すもの。

99
newacct

updateValueメソッドを使用できます。

postDict.updateValue(nil, forKey: surname)
22
Guiller

ここに記載 のように、辞書のキーに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"}
21
rintaro

Optionalタイプを使用できます

var postDict = ["pass": 123, "name": "ALi", "surname": Optional()]
3
Priya Raj
postDict[surname] = Optional<AnyObject>(nil)
2
Vatsal Manot
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")
    }
}
2
user3763801

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の答えを参照してください。

2
Matt Mathias

以下の辞書には、nil値のキーが1つあります

var dict = [String:Any?]()
dict["someKey"] = nil as Any?
0
Hiren Panchal