我已经在我的应用程序中向我的服务器发出了请求。并发布了这样的数据。服务器端正在等待所有参数,即使它们为零。但是我无法将零值添加到字典中。
var postDict = Dictionary<String,AnyObject>
postDict[pass]=123
postDict[name]="ali"
postDict[surname]=nil // dictionary still has only pass and name variables.
有没有办法将零值添加到字典中?
如何
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
编译器推断出nil
类型AnyObject??
,外部可选,这意味着删除键"foo"
的条目。
为了将键"foo"
的值设置为nil
AnyObject?
值,我们需要传入一个非nil
外部可选,其中包含值nil
的内部可选(类型AnyObject?
(。为了做到这一点,我们可以做
let v : AnyObject? = nil
x["foo"] = v
或
x["foo"] = nil as AnyObject?
任何表明我们有AnyObject?
nil
的东西,而不是AnyObject??
.
updateValue
方法:
postDict.updateValue(nil, forKey: surname)
如本文所述,在字典中为键设置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"}
postDict[surname] = Optional<AnyObject>(nil)
下面的字典将保存一个值为零的键
var dict = [String:Any?]()
dict["someKey"] = nil as Any?
Optional
类型
var postDict = ["pass": 123, "name": "ali", "surname": Optional()]
要在 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?
。
若要更新要nil
的键p1.name
的值,请在Dictionary
类型上使用 updateValue(_: forKey:)
方法。
people.updateValue(nil, forKey: p1.name)
people[p1.name]
密钥p1.name
的值现在为 nil
。 在这种情况下,使用 updateValue(_: forKey:)
更简单一些,因为它不涉及创建一次性实例、将其设置为 nil
以及将该实例分配给字典中的键。
注意:请参阅rintaro的答案,将null
插入帖子的字典中。
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")
}
}
postDict[surname]=nil
使用下标设置 nil 时。它会删除密钥(如果存在(。在这种情况下,如果存在,将从字典中删除键姓氏。
要将值设置为 nil,有某些方法。
postDict.updateValue(nil, forKey: surname)
或
let anyObjectNil : AnyObject? = nil
postDict[surname] = anyObjectNil
或
postDict[surname] = nil as AnyObject?