Как добавить значение nil в Swift Dictionary?
Я сделал запрос на свой сервер в своем приложении. И отправил данные что-то вроде этого. Серверная сторона ждет всех параметров, даже если они ноль. Но я не мог добавить значения nil в словарь.
var postDict = Dictionary<String,AnyObject>
postDict[pass]=123
postDict[name]="ali"
postDict[surname]=nil // dictionary still has only pass and name variables.
Есть ли способ добавить значение nil в словарь?
Ответы
Ответ 1
Как добавить значение 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"
.
Чтобы установить значение для ключа "foo"
в значение AnyObject?
nil
, нам нужно передать необязательный внешний элемент nil
, содержащий внутренний необязательный (тип AnyObject?
) значение nil
. Чтобы сделать это, мы можем сделать
let v : AnyObject? = nil
x["foo"] = v
или
x["foo"] = nil as AnyObject?
Все, что указывает, что мы имеем nil
of AnyObject?
, а не AnyObject??
.
Ответ 2
Как описанный здесь, установка 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"}
Ответ 3
Вы можете использовать метод updateValue
:
postDict.updateValue(nil, forKey: surname)
Ответ 4
Вы можете использовать тип Optional
var postDict = ["pass": 123, "name": "ali", "surname": Optional()]
Ответ 5
postDict[surname] = Optional<AnyObject>(nil)
Ответ 6
Чтобы добавить значение 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
type: Person?
.
Чтобы обновить значение ключа p1.name
как nil
, используйте метод updateValue(_: forKey:)
для типа Dictionary
.
people.updateValue(nil, forKey: p1.name)
people[p1.name]
Значение для клавиши p1.name
теперь nil
. Использование updateValue(_: forKey:)
является более простым в этом случае, потому что оно не предполагает создание экземпляра throwaway, устанавливающего его на nil
и назначение этого экземпляра ключу в словаре.
NB: См. ответ rintaro для вставки null
в словарь сообщений.
Ответ 7
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")
}
}
Ответ 8
Ниже словарь будет содержать один ключ со значением ноль
var dict = [String:Any?]()
dict["someKey"] = nil as Any?