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?
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??
.
Vous pouvez utiliser la méthode updateValue
:
postDict.updateValue(nil, forKey: surname)
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"}
Vous pouvez utiliser le type Optional
var postDict = ["pass": 123, "name": "ALi", "surname": Optional()]
postDict[surname] = Optional<AnyObject>(nil)
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")
}
}
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.
Le dictionnaire ci-dessous contiendra une clé avec une valeur nulle
var dict = [String:Any?]()
dict["someKey"] = nil as Any?