如何添加无价值的Swift Dictionary?
我在我的应用程序中向我的服务器发出了请求。 并发布数据像这样。服务器端正在等待所有参数,即使他们是零。 但是我不能将零值添加到字典中。
var postDict = Dictionary<String,AnyObject> postDict[pass]=123 postDict[name]="ali" postDict[surname]=nil // dictionary still has only pass and name variables.
有没有办法将零值添加到字典?
如何添加
nilSwift 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意味着删除元素本身。
例如,如果您希望在转换为JSON为null ,则可以使用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") } }