2015-05-25 2 views
4

Могу ли я добавить словарные массивы (это правильный термин для словарного ключа, содержащего несколько значений?) В массив?Swift: Как добавить словарные массивы в массив?

var dictionary = [String: [String]]() 
var array = [String]() 

var data1:String = "55a" 
var data2:String = "95a" 
var data3:String = "66" 
var data4:String = "25" 
var data5:String = "88b" 
var data6:String = "#" 

dictionary["3"] = [data1, data2, data3, data4, data5, data6] 

var data7:String = "#" 
var data8:String = "#" 
var data9:String = "#" 
var data10:String = "#" 
var data11:String = "#" 
var data12:String = "#" 

dictionary["2"] = [data7, data8, data9, data10, data11, data12] 

var data13:String = "100" 
var data14:String = "101" 
var data15:String = "102" 
var data16:String = "103" 
var data17:String = "104" 
var data18:String = "105" 

dictionary["1"] = [data13, data14, data15, data16, data17, data18] 

Я попытался это:

array.extend([dictionary["1"], dictionary["2"], dictionary["3"]]) 

но произошла ошибка "Невозможно вызвать 'расширить' со списком аргументов типа«([[(String)]?)" ..

Как добавить в массив словарь ["1"], ["2"] & ["3"]?

+0

вы должны проверить это http://stackoverflow.com/questions/26897176/add-a-dictionary-to-an-array-in-swift –

ответ

3

В случае, если вы не заинтересованы в том порядке, вы можете попробовать:

array.extend(flatMap(dictionary.values, {$0})) 

Если заказ важно, чтобы вы могли бы строить свои optionalArrays первая:

let optionalArrays = [dictionary["1"], dictionary["2"], dictionary["3"]] 
array.extend(flatMap(optionalArrays, {$0 ?? []})) 

т.е.ваш словарь возвращает необязательный массив, это вызывает сообщение об ошибке.

Надеется, что это помогает

+0

Спасибо! Помогает! Но не могли бы вы кратко объяснить, что такое «flatMap» и использование «$ 0», «??» и "[]" означает? –

+1

'flatMap' похож на' map', разница в том, что передаваемая вами функция должна возвращать массив. Тогда все отображенные массивы будут _flattened_ в один массив. В первом примере я просто использую '{$ 0}' как функцию сопоставления, он просто возвращает значение словаря, которое является массивом. Таким образом, все ваши массивы будут разбиты на «flatMap». Второй пример аналогичен, мне просто нужно позаботиться о том, что значение словаря может быть «Nothing». '{$ 0 ?? []} 'просто возвращает значение словаря, если оно существует, или пустой массив' [] ', если ключ словаря не имеет значения. –

+0

Тогда следует также рассмотреть возможность наличия значений словаря в первом примере и использовать {$ 0 ?? []}? –

5

Неверное объявление типа массива. Пожалуйста, попробуйте ниже одного

var array: [[String:[String]] = [] 
+0

Но что, если я хочу массив [String]? Как и во всех значениях ключей в словаре, сломанных и добавленных в массив? (Всего 24 объекта в новом массиве) –

+0

Для использования массива String - массив var: [String] = [] –

2

Ваш array переменной должен быть Array из Array с String элементами. Также не забудьте развернуть значения словарей, добавив !.

Попробуйте это:

var dictionary = [String: [String]]() 
var array = [[String]]() 


var data1:String = "55a" 
var data2:String = "95a" 
var data3:String = "66" 
var data4:String = "25" 
var data5:String = "88b" 
var data6:String = "#" 

dictionary["3"] = [data1, data2, data3, data4, data5, data6] 

var data7:String = "#" 
var data8:String = "#" 
var data9:String = "#" 
var data10:String = "#" 
var data11:String = "#" 
var data12:String = "#" 

dictionary["2"] = [data7, data8, data9, data10, data11, data12] 

var data13:String = "100" 
var data14:String = "101" 
var data15:String = "102" 
var data16:String = "103" 
var data17:String = "104" 
var data18:String = "105" 

dictionary["1"] = [data13, data14, data15, data16, data17, data18] 
array.extend([dictionary["1"]!, dictionary["2"]!, dictionary["3"]!]) 
+0

Спасибо! Но как мне это сделать, если я хочу массив [String] вместо массива [[String]]? –

+0

Вам, вероятно, потребуется выполнить итерацию по элементам внутреннего массива (словарь ["1"], словарь ["2" и т. Д.]) И добавить их во внешний массив (массив), поскольку у вас есть массив массивы. –

1

словарь значения возвращаются как optionals (таким образом, указывающей, если существует значение ключа) так что используйте '!' разворачивать значения каждого словаря массива (т.е. [dictionary["1"]!)

И как предложено в других ответах, измените тип массива, как он в настоящее время определяется как массивы строки, а не массив словарей.

+0

Спасибо! Но я на самом деле думал о наличии массива [String], где каждое значение для каждого ключа в словаре разбивается и добавляется в этот новый массив. Имея в общей сложности 24 объекта в этом новом массиве [String]. Это возможно? –

3

Если вам нужен массив массивов Strings, вам необходимо изменить тип массива, чтобы он был [[String]], как и другие ответы.

Но, получая значения из своего словаря, вы не должны принудительно разворачивать! Он может работать на этом примере, но в будущем вы, вероятно, попасть в беду с:

'fatal error: unexpectedly found nil while unwrapping an Optional value'

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

if let value = dictionary["1"] { 
    array.append(value) 
} 

// ... 

Или, вы можете получить все значения из словаря в массив так:

let array = Array(dictionary.values) 

Если вы на самом деле хотите массив String с, вы могли бы использовать flatMap:

let array = flatMap(dictionary.values) { $0 } 
+0

Спасибо! Я хочу спросить: 1) Если «$ 0.1» означает значение, значит, «$ 0» означает ключи в словаре? 2) Используя «dictionary.values», означает ли это, что значения изменены на ключ, а затем «$ 0» теперь относится к этим клавишам (которые первоначально являются значениями)? –

+0

Также .. 3) Выполняет ли flatMap (словарь) {$ 0.1} то же самое, что и flatMap (dictionary.values) {$ 0}? Большое вам спасибо. –

+2

В ответ на 1 и 2 я изменил его на 'Array (dictionary.values)' вместо использования 'map'. Но нет, '$ 0.0' будет ссылаться на ключ. '$ 0' относится к кортежу (ключ, значение),' .0' или '.1' относятся к ключу и значению соответственно. В ответ на 3 да, 'flatMap (dictionary) {$ 0.1}' имеет тот же эффект, что и flatMap (dictionary.values) {$ 0} '. – ABakerSmith

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