Как добавить нулевое значение в 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") } }