2016-08-20 70 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]) 
      } 
     } 
    } 
    } 

以下圖片顯示的是secondArraymiddleArray包含類似的內容,不應該是空的

enter image description here

enter image description here

enter image description here

+7

您應該在顯示錯誤之前去掉所有不相關的代碼,並且最好使樣例代碼可以粘貼到操場上並運行。這會讓其他人更容易看到發生了什麼。 –

回答

0

,我想我可以看到一個問題。該行崩潰的是:

spritesPath.append(middleArray2[middleRandomPointIndex2])對不對?

所以我的理論是,如果middleArray2爲空,那麼由arc4random_uniform返回的索引爲零。但是該數組沒有zeroeth元素。

如果是這樣,請在獲取數組元素之前檢查此條件。可能是將隨機索引代碼分解到它自己的函數中的好時機,你使用它很多,它會簡化你的設計。

可能:

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