如何在Swift Dictionary中添加nil值?

时间:2014-10-24 08:54:09

标签: swift dictionary null optional

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

 var postDict = Dictionary<String,AnyObject>
 postDict[pass]=123
 postDict[name]="ali"
 postDict[surname]=nil // dictionary still has only pass and name variables.

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

9 个答案:

答案 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?