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

Posted

技术标签:

【中文标题】Swift 致命错误:数组索引超出范围【英文标题】:Swift fatal error: Array index out of range 【发布时间】:2015-08-07 20:48:03 【问题描述】:

我正在将游戏创建为一个小项目,并且我正在努力做到这一点,因此在 5 点之后墙壁会生成更多,但是在玩游戏时,它会在达到 24 点左右崩溃,并出现错误“致命”错误:数组索引超出范围”

GameScene.swift

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

常量.swift

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

【问题讨论】:

那么当它崩溃时的currentLevel是多少? 【参考方案1】:

您正在调用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,这对于您的数组来说是无效索引。

【讨论】:

【参考方案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!!!

【讨论】:

【参考方案3】:

看起来错误就在这里:

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])

【讨论】:

以上是关于Swift 致命错误:数组索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

Swift CollectionView(致命错误:索引超出范围)

(Swift) 致命错误:索引超出范围

致命错误:在Swift中访问10个元素的数组时,数组索引超出范围

致命错误:注册后索引超出范围(Firebase、Swift)

Swift,CollectionView,致命错误:索引超出范围

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