2016-08-20 16 views
1

Я продолжаю получать ошибку fatal error: Index out of range. В моем массиве должны быть четкие элементы из приведенных ниже изображений, но он пуст. Попытка отладить его часами, я не слишком уверен в том, что вызывает. См. Изображения и код ниже.Массив пустой, когда он должен содержать элементы

 var topTest = [t2, t4, t8, t7, t2, t5, t8, t6 ] 
    for (index, point) in topTest.enumerate() { 

     spritesPath.append(point) 

     if index < topTest.count - 1 { 

     var previousArrayIndex = (index - 1)%topTest.count 
     if previousArrayIndex == -1 { 
      previousArrayIndex += topTest.count 
     } 
     var nextArrayIndex = (index + 1)%topTest.count 

     var firstIndex = topPositions.indexOf(point) 
     var secondIndex = topPositions.indexOf(topTest[nextArrayIndex]) 
     var firstArray = top[firstIndex!] 
     var secondArray = top[secondIndex!] 
     var middleIndex1 = 0 
     var middleArray1 = [CGPoint]() 
     var middleRandomArrayLength1 : UInt32 = 0 
     var middleRandomPointIndex1 = 0 
     var middleIndex2 = 0 
     var middleArray2 = [CGPoint]() 
     var middleRandomArrayLength2 : UInt32 = 0 
     var middleRandomPointIndex2 = 0 

     if point.x > topTest[nextArrayIndex].x { 

      if point.x > topTest[previousArrayIndex].x { 

       let rightPositionsX = rightPositions.map({ $0.x }) 
       middleArray1 = firstArray.filter({rightPositionsX.contains($0.x)}) 

       middleRandomArrayLength1 = UInt32(middleArray1.count) 
       middleRandomPointIndex1 = Int(arc4random_uniform(middleRandomArrayLength1)) 
       spritesPath.append(middleArray1[middleRandomPointIndex1]) 

       middleIndex1 = rightPositions.indexOf(middleArray1[middleRandomPointIndex1])! 
       middleArray1 = right[middleIndex1] 
       let middleArray1X = middleArray1.map({ $0.x }) 
       var midArray2 = secondArray.filter({middleArray1X.contains($0.x)}) 
       midArray2 = midArray2.filter({element in point.x > element.x && topTest[nextArrayIndex].x < element.x }) 

       middleRandomArrayLength2 = UInt32(midArray2.count) 
       middleRandomPointIndex2 = Int(arc4random_uniform(middleRandomArrayLength2)) 
       spritesPath.append(middleArray2[middleRandomPointIndex2]) 
      } 
      else{ 
       let secondArrayX = secondArray.map({ $0.x }) 
       middleArray1 = firstArray.filter({secondArrayX.contains($0.x)}) 

       middleArray1 = middleArray1.filter({element in point.x > element.x && topTest[nextArrayIndex].x < element.x }) 
       middleRandomArrayLength1 = UInt32(middleArray1.count) 
       middleRandomPointIndex1 = Int(arc4random_uniform(middleRandomArrayLength1)) 
       spritesPath.append(middleArray1[middleRandomPointIndex1]) 

      } 
     } 

else 
     { 

      if point.x < topTest[previousArrayIndex].x { 
       let leftPositionsX = leftPositions.map({ $0.x }) 
       middleArray1 = firstArray.filter({leftPositionsX.contains($0.x)}) 
       middleRandomArrayLength1 = UInt32(middleArray1.count) 
       middleRandomPointIndex1 = Int(arc4random_uniform(middleRandomArrayLength1)) 
       spritesPath.append(middleArray1[middleRandomPointIndex1]) 

       middleIndex1 = leftPositions.indexOf(middleArray1[middleRandomPointIndex1])! 
       middleArray1 = left[middleIndex1] 
       let middleArray1X = middleArray1.map({ $0.x }) 
       var midArray2 = secondArray.filter({middleArray1X.contains($0.x)}) 

       midArray2 = midArray2.filter({element in point.x < element.x && topTest[nextArrayIndex].x > element.x }) 

       middleRandomArrayLength2 = UInt32(midArray2.count) 
       middleRandomPointIndex2 = Int(arc4random_uniform(middleRandomArrayLength2)) 
       spritesPath.append(midArray2[middleRandomPointIndex2]) 
      } 

      else { 
       let secondArrayX = secondArray.map({ $0.x }) 
       middleArray1 = firstArray.filter({secondArrayX.contains($0.x)}) 
       middleArray1 = middleArray1.filter({element in point.x < element.x && topTest[nextArrayIndex].x > element.x }) 
       middleRandomArrayLength1 = UInt32(middleArray1.count) 
       middleRandomPointIndex1 = Int(arc4random_uniform(middleRandomArrayLength1)) 
       spritesPath.append(middleArray1[middleRandomPointIndex1]) 
      } 
     } 
    } 
    } 

Изображения ниже показывают, что secondArray и middleArray содержат аналогичные элементы и не должны быть пустыми

enter image description here

enter image description here

enter image description here

+7

Перед отображением ошибки вы должны вычеркнуть все несоответствующий код и, желательно, сделать так, чтобы образец кода можно было вставить в игровое поле и запустить. Это сделало бы намного проще, если бы другие увидели, что происходит. –

ответ

0

Я думаю, что я могу видеть проблему. Сбой линии:

spritesPath.append(middleArray2[middleRandomPointIndex2]) правый?

Итак, моя теория такова, что если middleArray2 пуст, то индекс, возвращаемый arc4random_uniform, равен нулю. Но массив не имеет нулевого элемента.

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

Может быть:

func randomElement(fromArray array:[T]) -> T? { 
     let upperBound = UInt32(array.count) 
     guard upperBound > 0 else { return nil } 
     let index = Int(arc4random_uniform(upperBound)) 
     return array[index] 
    } 

    let a = randomElement(fromArray: [1, 2, 3, 4, 5, 6, 7]) // 4 
    let b = randomElement(fromArray: ["red", "green", "blue"]) // "red" 
    let c = randomElement(fromArray: [Double]())    // nil 

Эта функция возвращает необязательный, так как массив не может иметь каких-либо элементов, чтобы вернуться!

+0

Да, просто проверил это: arc4random_uniform (0) действительно возвращает ноль. Я думаю, что вид края на arc4random. – ncke

+0

Очевидно, что эта же проблема применима ко всем остальным массивам. – ncke

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