2016-03-29 12 views
-1

Ich habe ein Problem, Xcode gibt mir diesen Fehler "EXC_BAD_INSTRUCTION (Code = EXC_1386_INVOP, Subcode == 0 * 0)", während ich versuche, meine Schaltflächen löschen Indizes in meinem Array, " Einkaufsliste". Bitte helfen Sie mir und sagen Sie mir, was ich falsch gemacht habe, damit ich später verbessern kann.Swift schlechte Anweisung Fehler Einkaufsliste

// 
// ViewController.swift 
// ShoppingList 
// 
// Created by Petr Chrastek on 29/03/16. 
// Copyright © 2016 ACS. All rights reserved. 
// 
class ViewController: UIViewController { 
    @IBOutlet weak var labelText: UILabel! 
    @IBOutlet weak var label0: UILabel! 
    @IBOutlet weak var label1: UILabel! 
    @IBOutlet weak var label2: UILabel! 
    @IBOutlet weak var label3: UILabel! 
    var shoppingList = ["eggs", "milk", "cake", "sugar"] 

    @IBAction func remove0(sender: UIButton) { 
     shoppingList.removeAtIndex(0) 
    } 

    @IBAction func remove1(sender: UIButton) { 
     shoppingList.removeAtIndex(1) 
    } 

    @IBAction func remove2(sender: UIButton) { 
     shoppingList.removeAtIndex(2) 
    } 

    @IBAction func remove3(sender: UIButton) { 
     shoppingList.removeAtIndex(3) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let str: String? = shoppingList[0] 
     let str1: String? = shoppingList[1] 
     let str2: String? = shoppingList[2] 
     let str3: String? = shoppingList[3] 
     let count = shoppingList.count 
     labelText.text? = "you are missing \(count) items" 
     if str != nil { 
      label0.text? = "\(str)" 
     } else { 
      label0.text? = "empty" 
     } 
     if str1 != nil { 
      label1.text? = "\(str1)" 
     } else { 
      label1.text? = "empty" 
     } 
     if str2 != nil { 
      label2.text? = "\(str2)" 
     } else { 
      label2.text? = "empty" 
     } 
     if str3 != nil { 
      label3.text? = "\(str3)" 
     } else { 
      label3.text? = "empty" 
     } 
     // 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. 
    } 
} 

Antwort

0

Nachdem Sie den ersten Eintrag aus der Liste löschen, shoppingList haben nur drei Elemente in ihr, so shoppingList[3] Zugriff wird mit 3 Artikel abstürzen (nicht vergessen, nur 0 .. < 2 gültig sind.

Die einfachste Weg, um das Problem zu lösen, ist das folgende Muster zu verwenden, so dass Sie die Zählung sind die Überprüfung sicher, dass Indizes gelten zu machen, bevor sie verwendet wird.

if shoppingList.count > 0 { 
    label0.text = shoppingList[0] 
} else { 
    label0.text = "empty" 
} 

if shoppingList.count > 1 { 
    label1.text = shopingList[1] 
} else { 
    label1.text = "empty" 
} 

ich auch einige zusätzliche Änderungen vorgenommen haben, wie nicht sinnlos mit String int erpolation ein String in die gleichen String zu drehen, da [String][n] immer ein String zurückkehren (nie ein String?) gibt es keine Notwendigkeit, mit den Optionals

beschäftigen Sie ähnliche Probleme haben werden (in der Tat wahrscheinlich das, was Sie laufen in jetzt), wenn Sie versuchen, zu:

shoppingList.removeAtIndex(3) 

zweites Mal seit 3 ​​nicht mehr gültige Index sind, statt, zu verwenden:

if shoppingList.count > 3 { 
    shoppingList.removeAtIndex(3) 
} 
+0

Generell 'Array' Index boun ds werden streng geprüft, im Gegensatz zu 'Dictionary', wo normalerweise ein fehlender Index einfach 'nil' zurückgibt –