2016-09-08 2 views
0

Ну, я совершенно смущен. Я пытаюсь получить массив ключей из словаря. Это то, что я писал:Невозможно преобразовать словарь в массив. Swift

if (customerViewModel.customer._dynamicMonthCount != nil) { 
    var array = customerViewModel.customer._dynamicMonthCount 
    var months_keys = Array(arrayLiteral: array!.keys) //that does not work 
} 

Ну, как вы поняли, «_dynamicMonthCount» является словарем:

var _dynamicMonthCount:Dictionary<String,Int>? 

Я даю ему значение, как я получаю данные от сервера в формате JSON. (На самом деле, этот словарь - это JSON Object в качестве словаря).

НО, каждый раз, когда я отлаживаю программу, я вижу, что массив [LazyMapCollection < [String: Int], String>].

Я пробовал с разным массивом, и она работает:

let dictionary = var regions:Dictionary<String,Int> = [...] //my static dictionary 
var values = Array(dictionary.values) //that works 
var keys = Array(dictionary.keys) //that works 

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

+2

переменная 'array' для * словаря * очень запутанным. Считайте также, что (почти) все * переменные * в вашем коде должны быть константами ('let') – vadian

+2

Вам никогда не придется использовать инициализатор' Array (arrayLiteral:) 'непосредственно (он предназначен для использования компилятором при работе с литералами массива) - просто используйте вместо этого 'Array (_ :)' initialiser ... как вы делаете в своем втором примере! – Hamish

+0

Что вы имеете в виду с 'том, что не работает'? Это крушение? Не удается ли его скомпилировать? Показывает пустой массив? – EmilioPelaez

ответ

4

Просто удалите arrayLiteral: вещь, и она будет работать!

var months_keys = Array(array!.keys) //that does not work 

arrayLiteral инициализатор должен быть использован, как это:

var month_keys = Array(arrayLiteral: 1, 2, 3, 4) 
// will produce an array with items: 1, 2, 3 and 4 

То, что вы должны вызвать вместо является (_: SequenceType) инициализатор, поскольку LazyMapCollection<[String : Int], String> соответствует этому протоколу.

Еще несколько советов для вашего кода:

  • Если значение переменной не изменится, объявить его let, вместо var.

  • Вы можете упростить это:

-

if (customerViewModel.customer._dynamicMonthCount != nil) { 
    var array = customerViewModel.customer._dynamicMonthCount 
    var months_keys = Array(array!.keys) 
} 

к этому:

if let dictionary = customerViewModel.customer._dynamicMonthCount { 
    var months_keys = Array(dictionay!.keys) 
} 
Смежные вопросы