Swift致命错误:数组索引超出范围

时间:2015-08-07 20:48:04

标签: xcode swift

我正在创建一个小型项目的游戏,并且我试图这样做,所以在5分之后,墙壁会产生更多,但在玩游戏时,它会在达到24点左右时崩溃。错误"致命错误:数组索引超出范围"

GameScene.swift

 if pointsLabel.number % kNumberOfPointsPerLevel == 0 {
                    currentLevel++
                    wallGenerator.stopGenerating()
                    wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[currentLevel])
                }

Constants.swift

let kNumberOfPointsPerLevel = 5
let kLevelGenerationTimes: [NSTimeInterval] = [1.0, 0.8, 0.6, 0.4, 0.3]

3 个答案:

答案 0 :(得分:3)

您每次kLevelGenerationTimes[currentLevel]都会currentLevel调用pointsLabel.number % kNumberOfPointsPerLevel == 0

kLevelGenerationTimes只有5个元素([1.0, 0.8, 0.6, 0.4, 0.3])和你提高等级的比率

Points: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Level : 0 0 0 0 0 1 1 1 1 1  2  2  2  2  2  3  3  3  3  3  4  4  4  4  4  5

25点,currentLevel变为5,这是您的数组的无效索引。

答案 1 :(得分:2)

之所以会这样,是因为您的数组 5个单元格,索引从0到4

如果您尝试访问索引超出此范围的数组,则应用程序将崩溃。

示例:

let kLevelGenerationTimes: [NSTimeInterval] = [1.0, 0.8, 0.6, 0.4, 0.3]

kLevelGenerationTimes[0] // ok
kLevelGenerationTimes[1] // ok
kLevelGenerationTimes[2] // ok
kLevelGenerationTimes[3] // ok
kLevelGenerationTimes[4] // ok
kLevelGenerationTimes[5] // crash!!!

答案 2 :(得分:1)

看起来错误就在这里:

wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[currentLevel])

currentLevel等于或大于kLevelGenerationTimes中的元素数时。

我不知道正确的解决方案是什么,取决于你的游戏逻辑 - 我会建议2个版本,第一次从该阵列的第一个元素重新启动一旦到达终点:

wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[currentLevel % kLevelGenerationTimes.count])

而第二种方法是始终使用数组的最后一个元素(随着玩家的进步,我将其视为一种日益增加的复杂性):

let index = currentLevel < kLevelGenerationTimes.count ? currentLevel : kLevelGenerationTimes.count - 1
wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[index])