2016-08-09 11 views
1

Ich versuche eine grundlegende Warenkorb-App zu erstellen, in der Sie einen Artikel in Ihren Warenkorb legen, die Kosten des Artikels in einem Array speichern und dann das Array anzeigen lassen können Klicken Sie auf "Empfang". Allerdings habe ich jedes Mal „Quittung“ auf meiner App klicken, wird der Simulator stürzt ab und zeigtAnzeige eines Arrays vom Typ Double auf UILabel in Xcode

"Thread1: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)

neben meinem Codezeile, die „AllItems + = item“ liest. Wenn jemand irgendwelche Ideen hat, wie ich mein Zahlenfeld in einem UILabel mit einer For-In-Schleife anzeigen kann, lass es mich wissen. Ich werde den Quellcode unten posten. Vielen Dank im Voraus

class ViewController: UIViewController { 

var priceOfApple = 1.75 
var cart = [Double]() 
var total = 0.00 

@IBOutlet weak var appName: UILabel! 
@IBOutlet weak var Balance: UILabel! 
@IBOutlet weak var Instructions: UILabel! 
@IBOutlet weak var redApple: UIButton! 
@IBOutlet weak var appleInfo: UILabel! 
@IBOutlet weak var addToCart: UIButton! 
@IBOutlet weak var itemsPurchased: UILabel! 


@IBAction func selectedApple(sender: AnyObject) { 

    Instructions.hidden = true 
    appleInfo.hidden = false 
    addToCart.hidden = false 
} 

@IBAction func purchaseApple(sender: AnyObject) { 

    cart.append(priceOfApple) 
    total += priceOfApple 
    Balance.text = "Balance : \(total)" 
    Instructions.hidden = false 
    appleInfo.hidden = true 
    addToCart.hidden = true 


} 

@IBAction func viewReceipt(sender: AnyObject) { 

    redApple.hidden = true 
    Instructions.hidden = true 
    itemsPurchased.hidden = false 

    for item in cart { 

     var allItems = Double(itemsPurchased.text!)! 
     allItems += item 
     allItems = Double(itemsPurchased.text!)! 
    } 
} 
} 
+2

Der Körper der 'item in cart'-Schleife ist sehr verwirrend. In jeder Iteration erstellen Sie eine neue Variable 'allItems' mit dem Inhalt eines Labels, dann fügen Sie' item' hinzu und schließlich setzen Sie die Variable wieder auf den Inhalt des Labels. Abgesehen von dieser Verwirrung ist entweder 'itemsPurchased.text'' nil' oder der Text kann nicht durch 'Double' dargestellt werden. – vadian

+0

Ich erstelle Variable allItems in jeder Iteration, weil ich möchte, dass alle Elemente im Array angezeigt werden. Gibt es einen besseren Weg, wie ich das machen könnte? – Michael

+0

Es gibt zwei schwerwiegende Probleme mit diesem Code. Das Schlimmste ist, dass die Variable außerhalb des Bereichs der Schleife nicht sichtbar ist und Sie vorherige Werte mit neuen Werten überschreiben. Sie sollten die Variable ** vor ** der Wiederholungsschleife erstellen. Fügen Sie den Code in einen Playground ein und testen Sie ihn. – vadian

Antwort

1

Wenn ich richtig verstehe, ist es das, was Sie tun sollten:

Zuerst eine Variable erstellen außerhalb der for-Schleife, dann in der Schleife die Variable jeden Wert in dem Array Speicherung getrennt beginnen wird durch „“ . Sobald es fertig ist, können Sie seinen Wert im Label anzeigen.

var itemsInCart = "" 

    for items in cart{ 

     itemsInCart += String(items) + " " 
    } 

    itemsPurchased.text = itemsInCart 

Ich hoffe es hilft !!!

+0

Ja, das hat enorm geholfen! Vielen Dank für Ihre Hilfe. Sehr geschätzt! – Michael

+0

Ich bin froh, dass ich dir helfen konnte :) –

0

Ein sauberer und sicherer Weg, es zu tun:

let result = cart.flatMap { Double(itemsPurchased.text ?? String()) }.reduce(0: combine: +) 

, das zu tun, sollten Sie EXC_BAD_INSTRUCTION nicht mehr bekommen, aber Sie sollten noch prüfen, ob der Text umwandelbar in ein Doppel ist .

+0

Danke für Ihre Lösung, aber ich versuche, ein besseres Verständnis für die Verwendung von for-in-Schleifen zu bekommen und suche nach einer Antwort mit einer for-in-Schleife. – Michael

Verwandte Themen