如何添加无价值的Swift Dictionary?

我在我的应用程序中向我的服务器发出了请求。 并发布数据像这样。服务器端正在等待所有参数,即使他们是零。 但是我不能将零值添加到字典中。

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

有没有办法将零值添加到字典?

如何添加nil Swift Dictionary?

基本上相同的方式,你添加任何其他值到字典。 你首先需要一个有价值的字典,它可以保存你的价值。 AnyObjecttypes的值不能nil 。 所以一个types为[String : AnyObject]的字典不能有nil值。

如果你有一个字典值types是一个可选types,如[String : AnyObject?] ,那么它可以容纳nil值。 例如,

 let x : [String : AnyObject?] = ["foo" : nil] 

如果你想使用下标语法来分配一个元素,这是有点棘手。 请注意,types[K:V]的下标具有typesV? 。 可选的是当你拿出来的时候,指出是否有这个键的入口,如果是的话,这个值; 当你把它放进去,它可以让你设置一个值或删除条目(通过分配nil )。

这意味着我们的字典types[String : AnyObject?] ,下标有AnyObject??typesAnyObject?? 。 同样,当您将一个值放入下标中时,“外”选项允许您设置值或删除条目。 如果我们只是写

 x["foo"] = nil 

编译器推断这是niltypes的AnyObject?? ,外部可选,这将意味着删除键"foo"的条目。

为了将关键"foo"的值设置AnyObject?nil ,我们需要传入一个非零的外部可选项,包含一个值为nil的内部可选项(types为AnyObject? )。 为了做到这一点,我们可以做到

 let v : AnyObject? = nil x["foo"] = v 

要么

 x["foo"] = nil as AnyObject? 

任何表示我们没有AnyObject? ,而不是AnyObject??

如此处所述 ,在字典中为键设置nil意味着删除元素本身。

例如,如果您希望在转换为JSONnull ,则可以使用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"} 

您可以使用updateValue方法:

 postDict.updateValue(nil, forKey: surname) 
 postDict[surname] = Optional<AnyObject>(nil) 

您可以使用Optionaltypes

 var postDict = ["pass": 123, "name": "ali", "surname": Optional()] 

要在Swift中为字典添加一个nil值,你的字典值必须是Optionaltypes。

考虑一个Person类:

 class Person { let name: String weak var spouse: Person? init(name: String, spouse: Person?) { self.name = name self.spouse = spouse } } 

Persontypes的实例可以有一个name和一个可选的spouse 。 创build两个实例,并将第一个添加到字典中:

 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?] 。 你现在有一个值为Optionaltypes的字典: Person?

要将密钥p1.name的值更新为nil ,请使用Dictionarytypes的updateValue(_: forKey:)方法。

 people.updateValue(nil, forKey: p1.name) people[p1.name] 

密钥p1.name值现在nil 。 在这种情况下使用updateValue(_: forKey:)更简单一些,因为它不涉及制作一次性实例,将其设置nil ,并将该实例分配给字典中的键。

注意:请参阅rintaro的答案,将null插入到post的字典中。

 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") } }