2017-01-04 5 views
0

Я пытаюсь захватить int из вложенного словаря. Мой код выглядит следующим образомПочему мой словарь продолжает возвращаться 0? Swift

convenience init(fromDict dict: [String:Any]) { 
    let dfs = dict["forms"] as? [[String :[String:Any]]] 
    self.init(
     atk: dfs?[0]["stats"]?["atk"] as? Int ?? 0, 
     def: dfs?[0]["stats"]?["def"] as? Int ?? 0, 
    ) 
} 

Однако результат продолжает вращаться до 0. Я знаю наверняка, что это правильный путь к файлу, так почему она не отображается правильное число? Ниже находится путь, из которого я берусь. Любая помощь в этом вопросе очень ценится.

<array> 
    <dict> 
    <key>forms</key> 
    <array> 
     <dict> 
      <key>stats</key> 
      <dict> 
       <key>atk</key> 
       <integer>49</integer> 
       <key>def</key> 
       <integer>49</integer> 
      </dict> 
     </dict> 
    </array> 
    </dict> 
<array/> 
+1

Использование отладчика и просмотр значений 'dfs' и' dfs [0] 'и' dfs [0] ["stats "]' и т. д. – rmaddy

+0

Вы также можете добавить 'print (dict)' в свой init. Он должен печатать '[" forms ": [[" stats ": [" def ": 49," atk ": 49]]]]'. – vacawama

+0

"форма": <__ NSCFArray 0x170266400> ( { статистика = { ака = 49; DEF = 49; }; – user4938361

ответ

1

Вы действительно не должны злоупотреблять дополнительной цепью, как это. Вы в основном просите об ошибках.

dfs является nil, потому что вы пытаетесь бросить его [[String :[String:Any]]] (a.k.a Array<Dictionary<String, <Dictionary<String, Any>>>), но его фактический тип [String :[String:Any]] (а.к.а. Dictionary<String, <Dictionary<String, Any>>).

Если у вас была правильная дополнительная обработка, вы бы сразу заметили эту ошибку.

convenience init(fromDict dict: [String:Any]) { 
    guard let let dfs = dict["forms"] as? [String :[String:Any]] else { 
     fatalError("Failed trying to cast dfs") 
    } 

    guard let stats = dfs["stats"] else { 
     fatalError("No value for \"stats\" key.") 
    } 

    guard let atk = stats["atk"] as? Int else { 
     fatalError("Missing or invalid value for \"atk\" key") 
    } 

    guard let def = stats["def"] as? Int else { 
     fatalError("Missing or invalid value for \"def\" key") 
    } 

    self.init(
     atk: atk, 
     def: def, 
    ) 
} 
+0

Извините, я обновил сообщение. '[[String: [String: Any]]]' на самом деле правильно, потому что это массив словарей. Также я получаю первую фатальную ошибку ** не удалось пытаясь наложить dfs **. Но я смотрю на plist и не понимаю, почему это не получится – user4938361

+0

В этом случае, когда вы использовали c ode, который я предоставил, изменили ли вы кастинг на '[[String: [String: Any]]]'? – Alexander

+0

Да, я обновил его, чтобы отразить правильный. Ошибка по-прежнему сохраняется на первом защитнике – user4938361

0

Так что я обнаружил проблему с моим вопросом. Я читаю из нескольких исходных файлов одновременно, и у одного из них нет словаря "stats".

Я понял, у меня было два варианта: создать заявление If-let для проверки на "stats" или скопировать то, что мне нужно из исходного файла-изгоев, и полностью удалить его. Я пошел с последним, так как этот исходный файл, как известно, вызывал у меня проблемы в прошлом

Смежные вопросы