web-dev-qa-db-fra.com

Comment ajouter une valeur nulle à Swift Dictionary?

J'ai fait une demande à mon serveur dans mon application. Et les données publiées quelque chose comme ça. Le côté serveur attend tous les paramètres même s'ils sont nuls. Mais je ne pouvais pas ajouter de valeurs nulles au dictionnaire.

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

Existe-t-il un moyen d'ajouter une valeur nulle au dictionnaire?

60
yatanadam

Comment ajouter une valeur de nil à Swift Dictionary?

Fondamentalement, de la même manière que vous ajoutez une autre valeur à un dictionnaire. Vous avez d'abord besoin d'un dictionnaire dont le type de valeur peut contenir votre valeur. Le type AnyObject ne peut pas avoir de valeur nil. Donc un dictionnaire de type [String : AnyObject] ne peut pas avoir de valeur nil.

Si vous aviez un dictionnaire avec un type de valeur qui était un type facultatif, comme [String : AnyObject?], il peut contenir des valeurs nil. Par exemple,

let x : [String : AnyObject?] = ["foo" : nil]

Si vous souhaitez utiliser la syntaxe en indice pour attribuer un élément, c'est un peu délicat. Notez qu'un indice de type [K:V] a le type V?. L'option facultative est pour, lorsque vous la retirez, indiquant s'il existe une entrée pour cette clé ou non, et si oui, la valeur; et lorsque vous le placez, il vous permet de définir une valeur ou de supprimer l'entrée (en affectant nil).

Cela signifie que pour notre dictionnaire de type [String : AnyObject?], l'indice a le type AnyObject??. Encore une fois, lorsque vous mettez une valeur en indice, l'option "externe" vous permet de définir une valeur ou de supprimer l'entrée. Si nous écrivions simplement

x["foo"] = nil

le compilateur déduit que pour être nil de type AnyObject??, l'option externe, ce qui signifierait supprimer l'entrée pour la clé "foo".

Afin de définir la valeur de la clé "foo" au AnyObject? valeur nil, nous devons passer un optionnel externe non -nil, contenant une option interne (de type AnyObject?) de valeur nil. Pour ce faire, nous pouvons faire

let v : AnyObject? = nil
x["foo"] = v

ou

x["foo"] = nil as AnyObject?

Tout ce qui indique que nous avons un nil de AnyObject?, et pas AnyObject??.

99
newacct

Vous pouvez utiliser la méthode updateValue:

postDict.updateValue(nil, forKey: surname)
22
Guiller

Comme documenté ici , définir nil pour une clé dans le dictionnaire signifie supprimer l'élément lui-même.

Si vous voulez null lors de la conversion en JSON par exemple, vous pouvez utiliser 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"}
21
rintaro

Vous pouvez utiliser le type Optional

var postDict = ["pass": 123, "name": "ALi", "surname": Optional()]
3
Priya Raj
postDict[surname] = Optional<AnyObject>(nil)
2
Vatsal Manot
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")
    }
}
2
user3763801

Pour ajouter une valeur nil à un dictionnaire dans Swift, les valeurs de votre dictionnaire doivent être de type Optional.

Considérons une classe Person:

class Person {
    let name: String
    weak var spouse: Person?

    init(name: String, spouse: Person?) {
        self.name = name
        self.spouse = spouse
    }
}

Les instances de type Person peuvent avoir un name et un spouse facultatif. Créez deux instances et ajoutez la première à un dictionnaire:

let p1 = Person(name: "John", spouse: nil)
let p2 = Person(name: "Doe", spouse: p1)
p1.spouse = p2
var people = [p1.name: p1.spouse]

Ce dictionnaire (appelé people) mappe les noms aux conjoints et est de type [String: Person?]. Vous avez maintenant un dictionnaire avec une valeur de Optional type: Person?.

Pour mettre à jour la valeur de la clé p1.name Pour qu'elle soit nil, utilisez la méthode updateValue(_: forKey:) sur le type Dictionary.

people.updateValue(nil, forKey: p1.name)
people[p1.name] 

La valeur de la clé p1.name Est désormais nil. L'utilisation de updateValue(_: forKey:) est un peu plus simple dans ce cas, car elle n'implique pas de créer une instance jetable, de la définir sur nil et d'attribuer cette instance à une clé dans un dictionnaire.

NB: Voir la réponse de rintaro pour insérer null dans le dictionnaire d'un article.

2
Matt Mathias

Le dictionnaire ci-dessous contiendra une clé avec une valeur nulle

var dict = [String:Any?]()
dict["someKey"] = nil as Any?
0
Hiren Panchal