我已在我的应用中向我的服务器发出了请求。并发布类似这样的数据。服务器端正在等待所有参数,即使它们是零。但我无法将nil值添加到字典中。
var postDict = Dictionary<String,AnyObject>
postDict[pass]=123
postDict[name]="ali"
postDict[surname]=nil // dictionary still has only pass and name variables.
有没有办法将nil值添加到字典?
答案 0 :(得分:95)
如何将
nil
值添加到Swift Dictionary?
基本上与向字典添加任何其他值的方式相同。您首先需要一个具有可以保存您的值的值类型的字典。类型AnyObject
的值不能为nil
。因此,[String : AnyObject]
类型的字典不能包含值nil
。
如果您的词典的值类型是可选类型,例如[String : AnyObject?]
,那么它可以保存nil
个值。例如,
let x : [String : AnyObject?] = ["foo" : nil]
如果你想使用下标语法来分配一个元素,那就有点棘手了。请注意,[K:V]
类型的下标具有类型V?
。当你把它拿出来时,可选的是指示是否有该条目的条目,如果是,则表示该值;当你把它放入时,它允许你设置一个值或删除条目(通过分配nil
)。
这意味着对于类型[String : AnyObject?]
的字典,下标的类型为AnyObject??
。再次,当你将一个值放入下标时,&#34;外部&#34; optional允许您设置值或删除条目。如果我们只是写了
x["foo"] = nil
编译器推断出nil
类型为AnyObject??
,外部可选,这意味着删除密钥"foo"
的条目。
为了设置键"foo"
的值为AnyObject?
值nil
,我们需要传入非nil
outer可选,包含值AnyObject?
的内部可选(类型为nil
)。为了做到这一点,我们可以做到
let v : AnyObject? = nil
x["foo"] = v
或
x["foo"] = nil as AnyObject?
任何表明我们nil
AnyObject?
而不是AnyObject??
的内容。
答案 1 :(得分:20)
作为documented in here,为字典中的键设置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"}
答案 2 :(得分:19)
您可以使用updateValue
方法:
postDict.updateValue(nil, forKey: surname)
答案 3 :(得分:3)
您可以使用Optional
类型
var postDict = ["pass": 123, "name": "ali", "surname": Optional()]
答案 4 :(得分:2)
postDict[surname] = Optional<AnyObject>(nil)
答案 5 :(得分:2)
要在Swift中为词典添加nil
值,您的词典值必须为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
。创建两个实例,并将第一个实例添加到字典中:
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
,请使用updateValue(_: forKey:)
类型上的Dictionary
方法。
people.updateValue(nil, forKey: p1.name)
people[p1.name]
密钥p1.name
的值现在为nil
。在这种情况下使用updateValue(_: forKey:)
稍微简单一点,因为它不涉及创建一次性实例,将其设置为nil
,并将该实例分配给字典中的键。
NB:请参阅rintaro将null
插入帖子词典的答案。
答案 6 :(得分:2)
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")
}
}
答案 7 :(得分:0)
下面的词典将保留一个值为nil的键
no
答案 8 :(得分:0)
postDict[surname]=nil
使用下标设置nil时。如果存在,它将删除密钥。在这种情况下,密钥姓氏将从字典中删除(如果存在)。
要将值设置为nil,有一些方法。
postDict.updateValue(nil, forKey: surname)
或
let anyObjectNil : AnyObject? = nil
postDict[surname] = anyObjectNil
或
postDict[surname] = nil as AnyObject?