所以我刚刚开始编程,现在我收到了这个错误。
每次按下按钮的次数都会超过列表中的Pizzas。
完整错误代码:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
:
到目前为止,这是我的代码:
import UIKit
var pizzaNumber = 0
var pizzaNames = ["Skinke Pizza", "Salat Pizza", "Pepperoni Pizza"]
let priser = [65,70,65]
var totalProdukt = pizzaNames.count
class ViewController: UIViewController {
@IBOutlet weak var produktNavn: UILabel!
@IBAction func rightButton(_ sender: UIButton) {
pizzaNumber+=1
showPizza()
}
@IBAction func leftButton(_ sender: UIButton) {
pizzaNumber-=1
if pizzaNumber < 0 {
pizzaNumber = 0
}
showPizza()
}
func showPizza() {
if pizzaNumber > totalProdukt {
pizzaNumber = pizzaNames.count
} else {
self.produktNavn.text = pizzaNames[pizzaNumber]
}
}
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.
}
}
答案 0 :(得分:1)
您应该确保pizzaNumber-1
永远不会大于数组中元素的数量,以确保您永远不会尝试访问不存在的索引。通过将totalProdukt
更改为计算变量,可以轻松完成此操作。这样,当您尝试访问变量时,变量的值将始终更新。
var totalProdukt: Int {
return pizzaNames.count
}
还要记住,数组索引从0开始,所以你需要
if pizzaNumber >= totalProdukt {
pizzaNumber = pizzaNames.count-1
} else {
self.produktNavn.text = pizzaNames[pizzaNumber]
}
请记住,使用当前代码,不需要将数组的计数存储在单独的变量中,因为您只在代码中的某个位置使用它。
此外,最干净的解决方案是在实际增加它之前检查值,而不是在使用它时,这种方式showPizzas
你不需要做任何检查,只需更新标签:
class ViewController: UIViewController {
@IBOutlet weak var produktNavn: UILabel!
@IBAction func rightButton(_ sender: UIButton) {
if pizzaNumber < pizzas.count-1 {
pizzaNumber+=1
}
showPizza()
}
@IBAction func leftButton(_ sender: UIButton) {
if pizzaNumber > 0 {
pizzaNumber-=1
}
showPizza()
}
func showPizza() {
self.produktNavn.text = pizzaNames[pizzaNumber]
}
}
答案 1 :(得分:0)
以下是如何修复错误
func showPizza() {
if pizzaNumber >= totalProdukt { // << Added '=' since pizzaNames[pizzaNames.count] is out of bounds
pizzaNumber = pizzaNames.count - 1
} else {
self.produktNavn.text = pizzaNames[pizzaNumber]
}
}