2016-06-12 6 views
0

Не смог найти ответ на этот вопрос.Как вставить значения в многомерный массив в петле swift

Я пытаюсь вставить значения в многомерный массив с чем-то вроде этого

_ = transportRef.observeEventType(.ChildAdded, withBlock: { (snapshotOne) in 

     self.yearList.insert(snapshotOne.key, atIndex: 0) 

     //print("snapshotone.key " + snapshotOne.key) // prints year 

     if let snapshotTwo = snapshotOne.children.allObjects as? [FIRDataSnapshot] { 

      for itemTwo in snapshotTwo { 

       self.monthList[self.counter].insert(itemTwo.key, atIndex: 0) 
      } 
     } 

     counter += 1 
} 

Моего counter находится в другом цикле вне этого. Дело в том, что я получаю erro Thread 1: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0) и после игры в Playground, я понимаю, что это потому, что мой monthList: [[String]] = [[]] и, следовательно, нет какого-либо массива для вставки или что-то в этом роде. Если бы я дал ему некоторый init, как monthList = [["1"], ["2"]], тогда я мог бы вставить до monthList[1], прежде чем он даст ошибку для monthList[2]

help? спасибо

+0

Показать ваш код и сообщить подробности об ошибке. – matt

+0

См. Также: [Многомерные массивы в Swift] (http://stackoverflow.com/q/24051490/1445366) –

+0

Я добавил более подробную информацию @matt – Chris

ответ

2

Когда вы объявляете свой массив массивов, ваш внешний массив пустой. Чтобы вставлять значения в многомерный массив, вам необходимо создать внутренние массивы и добавить их во внешний массив.

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

for item in itemsOne { 
    while counter >= monthList.count { 
     monthList.append([String]()) 
    } 
    monthList[counter].insert(item.key, atIndex: 0) 
} 

Если вы знаете заранее, что counter является значением из 0...29, например, вы могут создавать внутренние массивы следующим образом:

var monthList = [[String]](count:30, repeatedValue:[]) 
+0

большое вам спасибо! – Chris

0

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

monthList[counter] = [String]() 

for item in itemsOne { 
    monthList[counter].append(item.key) 
} 

Таким образом с помощью добавления вы можете динамически вставлять элементы в массиве. В противном случае вам понадобится другая переменная счетчика для увеличения вашего параметра atIndex для вашего метода вставки, потому что в вашем коде atIndex в методе insert всегда вставлялся в индекс 0.

+0

Спасибо за ваш ответ! имеет смысл. но исполнение должно быть похоже на vacawama – Chris

+0

@ Крис да, ответ vacuwama - это более приятное решение, чем мое, поэтому не беспокойтесь. Я мало знаю о быстром или синтаксисе, я просто замечаю возможную логическую ошибку при попытке добавить элемент во второй размерный массив без инициализации первого массива, это ошибка, которая будет происходить на большинстве языков программирования. vacuwama ответ - лучший ответ, который будет принят для других, чтобы увидеть:) – JustSomeDude

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