2017-09-25 8 views
0

プログラミングが始まったばかりで、このエラーが発生しています。配列リストにピザが表示される回数よりも多く押すと、スウィフトエラーが発生する

ピザがリストに表示される回数よりも多くボタンを押すたびに発生します。

完全なエラーコード:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0):これまで

Here`s私のコード:

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. 
    } 

} 
+1

されていますそれ[Offset-by-Oneバグ](https://en.wikipedia.org/wiki/Off-by-one_error)? – user28434

答えて

1

あなたが行う必要がありますあなたのエラーを修正する方法を示しますpizzaNumber-1は決して大きくなることはありません存在しないインデックスにアクセスしようとしていないことを確認するために、配列内の要素の数。これは、totalProduktを計算変数に変更することで簡単に行うことができます。この方法では、変数の値はアクセスしようとすると常に更新されます。

var totalProdukt: Int { 
    return pizzaNames.count 
} 

はまた、その配列のインデックスは0から始まるので、あなたの現在のコードで、別々に配列の数を格納する必要はありませんということを心に留め

if pizzaNumber >= totalProdukt { 
    pizzaNumber = pizzaNames.count-1 
} else { 
    self.produktNavn.text = pizzaNames[pizzaNumber] 
} 

を必要とする心に留めあなたがコード内の1か所でしか使用していないためです。

また、クリーンなソリューションが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] 
    } 

} 
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] 
    } 
} 
関連する問題