Массив пуст, когда он должен четко содержать элементы

ios swift xcode swift2 fatal-error

79 просмотра

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содержат похожие элементы и не должны быть пустыми

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Автор: OnlyCodeMatters Источник Размещён: 08.11.2019 11:13

Ответы (1)


0 плюса

Я думаю, что вижу проблему. Сбой строки:

spritesPath.append(middleArray2[middleRandomPointIndex2]) правильно?

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

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

Может быть:

func randomElement (из массива из массива: [T]) -> T? {
        let upperBound = UInt32 (array.count)
        guard upperBound> 0 else {return nil}
        let index = Int (arc4random_uniform (upperBound))
        возвращаемый массив [индекс]
    }

    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

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

Автор: ncke Размещён: 20.08.2016 11:49
Вопросы из категории :
32x32