数组为空时应清楚地包含元素

时间:2016-08-20 11:13:44

标签: ios swift xcode swift2 fatal-error

我一直收到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

1 个答案:

答案 0 :(得分: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

此函数返回一个可选项,因为该数组可能没有任何要返回的元素!