如何添加无价值的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?
基本上相同的方式,你添加任何其他值到字典。 你首先需要一个有价值的字典,它可以保存你的价值。 AnyObject
types的值不能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
编译器推断这是nil
types的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)
您可以使用Optional
types
var postDict = ["pass": 123, "name": "ali", "surname": Optional()]
要在Swift中为字典添加一个nil
值,你的字典值必须是Optional
types。
考虑一个Person
类:
class Person { let name: String weak var spouse: Person? init(name: String, spouse: Person?) { self.name = name self.spouse = spouse } }
Person
types的实例可以有一个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?]
。 你现在有一个值为Optional
types的字典: Person?
。
要将密钥p1.name
的值更新为nil
,请使用Dictionary
types的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") } }