如何为 Swift Dictionary 添加 nil 值



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

 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意味着删除元素本身。

例如,如果要在转换为JSONnull,则可以使用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?

最新更新