我有一个带有按钮的应用程序,每次按下它时,变量都会添加 1。然后由变量设置标签。但是当标签达到 8 时,您再次按下按钮时,它会崩溃并显示fatal error: Index out of range
这是我的代码:
import UIKit
class ViewController: UIViewController {
// OUTLETS
@IBOutlet weak var score: UILabel!
@IBAction func add(_ sender: Any) {
add()
}
// VARIABLES
var scoreVar = 0
let levelUpAt = [50, 100, 500, 1000, 5000, 10000, 50000, 100000]
var currentLevel = 1
var toAdd = 1
// OVERRIDES
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// FUNCTIONS
// Below code adds to the score
func add() {
scoreVar += 1 // Adds 1 to scoreVar
score.text = "(scoreVar)"; // Updates text to match
checkForLevelUp(); // Calls the function defined in the next few days ago
}
// Below code checks if the score meets the next level requirements
func checkForLevelUp() {
if (scoreVar - 1 < levelUpAt[currentLevel - 1]) { // Complicated math-y if statment
currentLevel += 1
toAdd += 1
}
}
}
在这里: if levelUpAt[currentLevel - 1]
您正在访问数组元素。您的数组中只有 8 个元素。一旦currentLevel
达到 8,它将访问数组不持有的元素,因此它会崩溃。
数组中只有 8 个元素。
let levelUpAt = [50, 100, 500, 1000, 5000, 10000, 50000, 100000]
currentLevel = 9
,你打电话给checkForLevelUp()
,它现在已经超出了范围。
我根本不知道 swift,但您正在 checkForLevelUp 的 8 个项目的数组中查找一个值。
在查看数组之前,您应该添加检查您是否在数组的范围内。
那是因为你的变量是 8,数组的最后一个索引是 7,这就是你得到fatal error: Index out of range
的方式。
改为这样做你的if-statement
:
if (scoreVar - 1 < levelUpAt[currentLevel - 1] && levelUpAt.indices.contains(currentLevel)) { ... }
所以你基本上检查你的数组中是否存在该索引:
levelUpAt.indices.contains(currentLevel)