如何在Swift Dictionary中添加nil值?

yat*_*dam 61 null dictionary optional swift

我已经在我的应用程序中向我的服务器发出了请求.并发布类似这样的数据.服务器端正在等待所有参数,即使它们是零.但我无法将nil值添加到字典中.

 var postDict = Dictionary<String,AnyObject>
 postDict[pass]=123
 postDict[name]="ali"
 postDict[surname]=nil // dictionary still has only pass and name variables.
Run Code Online (Sandbox Code Playgroud)

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

new*_*cct 102

如何为nilSwift Dictionary 增加价值?

基本上与向字典添加任何其他值的方式相同.您首先需要一个具有可以保存您的值的值类型的字典.类型AnyObject不能有值nil.所以类型字典[String : AnyObject]不能有价值nil.

如果您的字典值类型是可选类型[String : AnyObject?],那么它可以保存nil值.例如,

let x : [String : AnyObject?] = ["foo" : nil]
Run Code Online (Sandbox Code Playgroud)

如果你想使用下标语法来分配一个元素,那就有点棘手了.请注意,类型的下标[K:V]具有类型V?.当你把它拿出来时,可选的是指示是否有该条目的条目,如果是,则表示该值; 当你把它放入时,它允许你设置一个值或删除条目(通过分配nil).

这意味着对于我们的类型字典[String : AnyObject?],下标有类型AnyObject??.同样,当您将值放入下标时,"outer"可选允许您设置值或删除条目.如果我们只是写

x["foo"] = nil
Run Code Online (Sandbox Code Playgroud)

编译器推断nil为类型AnyObject??,外部可选,这意味着删除键的条目"foo".

为了将key 的值设置为值,我们需要传入一个非外部可选项,包含一个内部可选(类型)值.为了做到这一点,我们可以做到"foo"AnyObject?nilnilAnyObject?nil

let v : AnyObject? = nil
x["foo"] = v
Run Code Online (Sandbox Code Playgroud)

要么

x["foo"] = nil as AnyObject?
Run Code Online (Sandbox Code Playgroud)

凡是表明我们拥有nilAnyObject?,而不是AnyObject??.

  • 将nil分配给字典条目的明智之处就是删除条目,即使nil是字典被定义为具有AnyObject时的有效条目?还是什么?项?这只花了我几个小时,让我对Swift的看法降低了几个档次. (6认同)
  • 正确答案是来自 Guiller 的,通过使用下标设置 nil 值,您可以删除键的值,而使用函数 `updateValue` 可以在保留键的同时将值设置为 nil。 (2认同)

小智 25

您可以使用以下updateValue方法:

postDict.updateValue(nil, forKey: surname)
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这被否决,但恕我直言,这是最好的方法。 (2认同)

rin*_*aro 21

如此处所述,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"}
Run Code Online (Sandbox Code Playgroud)


Vat*_*not 5

postDict[surname] = Optional<AnyObject>(nil)
Run Code Online (Sandbox Code Playgroud)