2015-06-26 2 views
-2

Для доступа ко второму значению второго ключа словаря ниже:SWIFT словари - Доступ одно значение ключа с несколькими значениями

Этот вопрос не о том, чтобы любое значение ключа, но если это значение является массивом.

Для следующей переменной

var dict2 = ["key1" : "value1", "key2" : [ "value1" , "value2" ]] 

Это работает (вариант 1)

let value2 = dict2["key2"]?[1] as? String 
println(value2!) 

Но этого делать не (option2)

let value2 = dict2["key2"][1] 

Другие пользователи предложили второй вариант, но это не сработает. Я блуждаю, почему.

Почему я должен использовать тип? Я предполагаю, что если бы значение было Int, мне пришлось бы использовать его как Int. Но это предполагает, что я знаю, какой тип ценности существует и существует. Так почему его называют необязательным?

ответ

4

Поскольку ваш словарь имеет различные типы значений, то, вероятно, будет AnyObject в качестве типа стоимость. Вы захотите применить его к типу. Кроме того, словарный доступ возвращает опции, поскольку ключ может отсутствовать в словаре, поэтому вам нужно развернуть значение для доступа к нему. Наконец, ваше значение представляет собой массив, поэтому используйте индекс массива (1 для доступа ко второму элементу, так как индексы массива равны 0). Вот конкретный пример:

let dict = ["age" : 31, "names" : [ "Fred" , "Freddie" ]] 

if let val = dict["names"]?[1] as? String { 
    println(val) // prints "Freddie" 
} 

Поскольку индекс массива вне диапазона приведет к сбою программы, чтобы быть полностью безопасным вы хотите сделать что-то вроде этого:

if let array = dict["names"] as? [String] { 
    if array.count > 1 { 
     let name = array[1] 
     println(name) 
    } 
} 

Этот стиль защищает вас в следующие способы:

  1. Если ключ "names" не в словаре, то if let ничего не будет делать, а не сбой.
  2. Если ваше значение не является массивом String, как вы и предполагали, то if let ничего не будет делать.
  3. Сначала проверив array.count, это гарантирует, что вы не получите ошибку индекса массива из-за пределов.

Чтобы добавить значение "key2" вам нужно сначала явно дать словаря типа [String: AnyObject], так как тип вывод Свифт является NSDictionary и этот тип является неизменным, даже если они будут объявлены с var.

var dict2:[String: AnyObject] = ["key1" : "value1", "key2" : [ "value1" , "value2" ]] 

if let value = dict2["key2"] as? [String] { 
    dict2["key2"] = value + ["value3"] 
} 
+0

обновленный вопрос выше – GuiSoySauce

1

Если вы уверены, что второй ключ будет иметь два элемента, вы можете получить доступ к второму элементу с:

var value = dict[key2][1] 
+0

Вот код, который я пытаюсь. 'вар dict2 = [ "key1": "value1", "key2": [ "value1", 45]]' Это работает 'пусть значение2 = dict2 [ "key2"] [1], как? Int Println (значение2!) ' Это не ' пусть value3 = dict2 [ "key2"] [1] Println (value3) ' Так что не уверен, о причинах и дополнительными опциями, чтобы бросить это тип. – GuiSoySauce