Как добавить нулевое значение в Swift словарь?
Я сделал запрос на мой сервер в мое приложение. И выложил данные что-то вроде этого.Серверная сторона ждет всех параметров, даже если они равны нулю. Но я не мог добавить нулевые значения в словарь.
var postDict = Dictionary<String,AnyObject>
postDict[pass]=123
postDict[name]="ali"
postDict[surname]=nil // dictionary still has only pass and name variables.
есть ли способ добавить нулевое значение в словарь ?
7 ответов:
как добавить
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"
.чтобы set значение ключа
"foo"
доAnyObject?
стоимостьюnil
, нам нужно пройти в не -nil
наружное опционное, содержа внутреннее необязательно (типаAnyObject?
) стоимостьюnil
. Для того чтобы сделать это, мы можем сделатьlet v : AnyObject? = nil x["foo"] = v
или
x["foo"] = nil as AnyObject?
все, что указывает на то, что у нас есть
nil
наAnyObject?
, а неAnyObject??
.
как документированы здесь установка
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"}
добавить
nil
значение для словаря в Swift, значения вашего словаря должны быть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
, и присвоение этого экземпляра ключу в словаре.Примечание: см. ответ Ринтаро для вставки
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") } }