2015-06-22 4 views
1

Я пытаюсь обновить значение в комплексе Dictionary неизвестного типа, так как он содержит как String s, так и под-словари. Мой код функции инициализации ниже.Невозможно обновить значение вложенного словаря

Это то, что мой Dictionary выглядит как раньше:

var methods = [ 
    "PUN": [ 
     "name": "Time of PUN", 
     "params": ["FJ": 18, "IS": 17] 
    ], 
    "KHR": [ 
     "name": "Time KHR", 
     "params": ["FJ": 15, "IS": 15] 
    ], 
    "LHR": [ 
     "name": "Time of LHR", 
     "params": ["FJ": 19.5, "IS": 17.5 , "MG": 8.9] 
    ] 
] 

Это то, что я хочу достичь, динамически:

var methods = [ 
    "PUN": [ 
     "name": "Time of PUN", 
     "params": ["FJ": 18, "IS": 17, "Offset": "0 min", "Midnight": "Standard"] 
    ], 
    "KHR": [ 
     "name": "Time KHR", 
     "params": ["FJ": 15, "IS": 15, "Offset": "0 min", "Midnight": "Standard"] 
    ], 
    "LHR": [ 
     "name": "Time of LHR", 
     "params": ["FJ": 19.5, "IS": 17.5 , "MG":8.9, "Offset": "0 min", "Midnight": "Standard"] 
    ] 
] 

Это мой код:

Я принимаю дополнительные значения от defaultParams (Dictionary) и вставить в methods (Dictionary).

var methods = [String: AnyObject]() 
let defaultParams = ["Offset": "0 min", "Midnight": "Standard"] 

init() { 
    methods["Punjab"] = [ 
     "name": "Punjab Time", 
     "params": ["FJ": 18, "IS": 17] 
    ] 

    methods["Karachi"] = [ 
     "name": "Time of Karachi", 
     "params": ["FJ": 15, "IS": 15] 
    ] 

    methods["Lahore"] = [ 
     "name": "Lahore City Time", 
     "params": ["FJ": 19.5, "IS": 17.5 , "MG": 8.9] 
    ]  

    for (methodName, methodValue) in methods { 
     var params = methodValue["params"]!! 

     for (defaultParamKey, defaultParamValue) in defaultParams { 
      if params.objectForKey(defaultParamKey) == nil { 
       // I am having problem with the line below, it says 
       // cannot asign a value of type String to a value of type AnyObject?! 
       params[defaultParamKey] = defaultParamValue 
      } 
     } 
    } 
} 

На инициализации я просто хочу, чтобы вставить пропущенные значения в словаре переменной methods, проверив его с переменной defaultParams.

+0

Что должно идти где? Не ясно. Пожалуйста, объясните, что вы хотите подробно. – Moritz

+0

Зачем голосовать -1 Я думал, что это сообщество помогает людям или это просто для критики и ниспровержения, если кто-то не понимает, я могу объяснить это дальше. Если люди будут держать под вопросом настоящий вопрос, чем то, что нужно для сохранения этого сайта. Я сделал свое исследование и немного подождал, прежде чем приходить сюда и просить о помощи. – user606669

+0

Функция init, указанная выше, называется вызывающей. и метод с именем переменной, который я хочу изменить внутри init() – user606669

ответ

2

Это немного запутанным, но это работает:

class Test { 
    var methods = [String: [String: AnyObject]]() 
    let defaultParams = ["Offset": "0 min", "Midnight": "Standard"] 

    init() { 
     methods["Punjab"] = [ 
      "name": "Punjab Time", 
      "params": ["FJ": 18, "IS": 17] 
     ] 

     methods["Karachi"] = [ 
      "name": "Time of Karachi", 
      "params": ["FJ": 15, "IS": 15] 
     ] 

     methods["Lahore"] = [ 
      "name": "Lahore City Time", 
      "params": ["FJ": 19.5, "IS": 17.5 , "MG": 8.9] 
     ] 

     for (methodName, methodValue) in methods { 

      for (mKey, mValue) in methodValue { 

       if mKey == "params" { 

        var pDic = mValue as! [String: AnyObject] 

        for (defaultKey, defaultValue) in defaultParams { 

         if !contains(pDic.keys, defaultKey) { 

          pDic[defaultKey] = defaultValue 

          methods[methodName]!["params"]! = pDic 

         } 

        } 



       } 

      } 

     } 
    } 
} 

let t = Test() 
println(t.methods) 

Результат:

[Карачи: [Титулы: { FJ = 15; IS = 15; Midnight = Standard; Смещение = "0 мин"; }, имя: Время Карачи], Пенджаб: [params: { FJ = 18; IS = 17; Midnight = Standard; Смещение = "0 мин"; }, имя: Пенджаб Время], Лахор: [params: { FJ = "19.5"; IS = "17,5"; MG = "8,9"; Midnight = Standard; Смещение = "0 мин"; }, имя: Lahore City Time]]

+0

человек ур потрясающий, спасибо. Это отлично работает. – user606669

0

вместо == nil, вы должны использовать закрытие if let, я не знаю, какое значение вы хотите назначить, но этот подход будет работать.

if let value = params.objectForKey(defaultParamKey) as? String { 
      params[defaultParamKey] = value 
} 
+0

снова получить эту ошибку: нельзя присвоить значение типа 'String' значению типа 'AnyObject ?!' – user606669

+0

В дополнение к этому приведенный выше код будет выполняться только в том случае, если ключ присутствует в методах ["params"], тогда как моя проблема заключается в том, что я хочу добавить отсутствующие ключи и значения в методы ["params"], сравнивая их с параметрами по умолчанию, т. е. эти ([«Смещение»: «0 мин», «Полночь»: «Стандарт»)) – user606669