Подтвердить что ты не робот

Как добавить значение 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 в словарь?

4b9b3361

Ответ 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?