Как добавить нулевое значение в Swift словарь?


Я сделал запрос на мой сервер в мое приложение. И выложил данные что-то вроде этого.Серверная сторона ждет всех параметров, даже если они равны нулю. Но я не мог добавить нулевые значения в словарь.

 var postDict = Dictionary<String,AnyObject>
 postDict[pass]=123
 postDict[name]="ali"
 postDict[surname]=nil // dictionary still has only pass and name variables.

есть ли способ добавить нулевое значение в словарь ?

7 53

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"}

можно использовать updateValue способ:

postDict.updateValue(nil, forKey: surname)

можно использовать Optional тип

var postDict = ["pass": 123, "name": "ali", "surname": Optional()]

добавить 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 в словарь поста.

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")
    }
}