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中访问10个元素的数组时,数组索引超出范围
致命错误:注册后索引超出范围(Firebase、Swift)