Ich habe in meiner App eine Anfrage an meinen Server gestellt. Und gepostete Daten wie diese. Die Serverseite wartet auf alle Parameter, auch wenn sie gleich Null sind. Aber ich konnte dem Wörterbuch keine Nullwerte hinzufügen.
var postDict = Dictionary<String,AnyObject>
postDict[pass]=123
postDict[name]="ali"
postDict[surname]=nil // dictionary still has only pass and name variables.
Gibt es eine Möglichkeit, dem Wörterbuch keinen Wert hinzuzufügen?
swift
dictionary
null
optional
Yatanadam
quelle
quelle
nil
zu einem Schlüssel, es wird zurückkehrennil
nächstes Mal , wenn Sie diesen Schlüssel zugreifen (weil es das Objekt und das entfernte Objekt entfernt ist nicht da). Wenn Sie einennil
Wert ungleich Null darstellen möchten , können Sie verwendenNSNull()
.Antworten:
Grundsätzlich genauso, wie Sie einem Wörterbuch einen anderen Wert hinzufügen. Sie benötigen zunächst ein Wörterbuch mit einem Werttyp, der Ihren Wert enthalten kann. Der Typ
AnyObject
kann keinen Wert habennil
. Ein Wörterbuch vom Typ[String : AnyObject]
kann also keinen Wert habennil
.Wenn Sie ein Wörterbuch mit einem Werttyp hatten, der ein optionaler Typ war
[String : AnyObject?]
, kann esnil
Werte enthalten. Zum Beispiel,let x : [String : AnyObject?] = ["foo" : nil]
Wenn Sie die tiefgestellte Syntax verwenden möchten, um ein Element zuzuweisen, ist dies etwas schwierig. Beachten Sie, dass ein Index vom Typ Typ
[K:V]
hatV?
. Die Option dient dazu, beim Herausgeben anzugeben, ob für diesen Schlüssel ein Eintrag vorhanden ist oder nicht, und wenn ja, den Wert. und wenn Sie es eingeben, können Sie entweder einen Wert festlegen oder den Eintrag entfernen (durch Zuweisennil
).Das heißt, für unser Typwörterbuch
[String : AnyObject?]
hat der Index TypAnyObject??
. Wenn Sie einen Wert in den Index einfügen, können Sie mit der Option "Outer" optional einen Wert festlegen oder den Eintrag entfernen. Wenn wir einfach schreiben würdenx["foo"] = nil
Der Compiler schließt daraus, dass es sich
nil
um einen Typ handeltAnyObject??
, der äußere optional, was bedeuten würde, den Eintrag für den Schlüssel zu entfernen"foo"
.Um zu setzen , den Wert für die Schlüssel
"foo"
auf denAnyObject?
Wertnil
, müssen wir in einem nicht passierennil
äußeren optional, eine innere optional (vom Typ enthaltendAnyObject?
) von Wertnil
. Um dies zu tun, können wir es tunlet v : AnyObject? = nil x["foo"] = v
oder
x["foo"] = nil as AnyObject?
Alles, was darauf hinweist, dass wir ein
nil
vonAnyObject?
haben und nichtAnyObject??
.quelle
NSNull()
!static let NullObject: AnyObject?? = Optional(nil)
updateValue
Sie den Wert auf Null setzen, während Sie den Schlüssel behalten.= nil as Foo?
.Sie können die
updateValue
Methode verwenden:postDict.updateValue(nil, forKey: surname)
quelle
Wie hier dokumentiert , bedeutet das Festlegen
nil
eines Schlüssels im Wörterbuch das Entfernen des Elements selbst.Wenn Sie beispielsweise
null
beim Konvertieren in möchtenJSON
, können Sie verwendenNSNull()
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"}
quelle
Sie können den
Optional
Typ verwendenvar postDict = ["pass": 123, "name": "ali", "surname": Optional()]
quelle
postDict[surname] = Optional<AnyObject>(nil)
quelle
<AnyObject>
. Es sollte in der Lage sein, den Typ abzuleiten.Um
nil
einem Wörterbuch in Swift einen Wert hinzuzufügen , müssen die Werte Ihres Wörterbuchs vomOptional
Typ sein.Betrachten Sie eine
Person
Klasse:class Person { let name: String weak var spouse: Person? init(name: String, spouse: Person?) { self.name = name self.spouse = spouse } }
Instanzen dieses
Person
Typs können einname
und ein optionales habenspouse
. Erstellen Sie zwei Instanzen und fügen Sie die erste einem Wörterbuch hinzu:let p1 = Person(name: "John", spouse: nil) let p2 = Person(name: "Doe", spouse: p1) p1.spouse = p2 var people = [p1.name: p1.spouse]
Dieses Wörterbuch (genannt
people
) ordnet Namen Ehepartnern zu und ist vom Typ[String: Person?]
. Sie haben jetzt ein Wörterbuch mit dem WertOptional
:Person?
.Verwenden Sie die Methode für den Typ, um den Wert des zu verwendenden Schlüssels
p1.name
zu aktualisieren .nil
updateValue(_: forKey:)
Dictionary
people.updateValue(nil, forKey: p1.name) people[p1.name]
Der Wert für den Schlüssel
p1.name
ist jetztnil
. Die VerwendungupdateValue(_: forKey:)
ist in diesem Fall etwas einfacher, da keine Wegwerfinstanz erstellt und auf gesetzt werden mussnil
und diese Instanz einem Schlüssel in einem Wörterbuch zugewiesen werden muss.NB: Siehe Rintaros Antwort zum Einfügen
null
in das Wörterbuch eines Posts .quelle
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") } }
quelle
var dict = [Int: Int?]()
. Es ist eine Definition, nicht nur eine Erklärung.var dict = [String:Any?]() dict["someKey"] = nil as Any?
quelle
nil
Wert für einen Schlüssel festzulegen.postDict[surname]=nil
Wenn Sie den Index verwenden, um Null zu setzen. Es löscht den Schlüssel, falls vorhanden. In diesem Fall wird der Schlüsselname aus dem Wörterbuch entfernt, falls vorhanden.
Um den Wert auf Null zu setzen, gibt es bestimmte Möglichkeiten.
postDict.updateValue(nil, forKey: surname)
oder
let anyObjectNil : AnyObject? = nil postDict[surname] = anyObjectNil
oder
postDict[surname] = nil as AnyObject?
quelle