2016-05-24 20 views
-1

Der Versuch, Daten in Swift (2) von einem NSDictionary mit Xcode 7.3 Ich kam über den berüchtigten EXC_BAD_INSTRUCTION (code = EXCI386_INVOP, Subcode = 0X0) Fehler beim Lesen zu lesen, wenn sie versuchen dies:Absturz mit Int32 mit Swift 2 und Kerndaten

let aDict = data as! NSDictionary 
car.tempo = aDict["tempo"] as! Int32 

Keine Compilerwarnungen obwohl. Ich bin mir bewusst, dass es in der Vergangenheit Probleme mit Xcode, Swift und Int32s gab. Irgendwelche Vorschläge wie man damit besser umgehen kann? TIA!

Da war es nicht klar vielleicht - Daten wie oben gezeigt wird garantiert Daten aus einer Plist-Datei enthalten und aDict ["Tempo"] ist eine NSNummer.

+0

"Verwenden Sie die erzwungene Form des Typumsetzungsoperators (as!) Nur dann, wenn Sie sicher sind, dass der Downcast immer erfolgreich ist. Diese Form des Operators löst einen Laufzeitfehler aus, wenn Sie versuchen, auf einen falschen Klassentyp zu reduzieren. " –

+1

Oder anders gesagt, jedes Mal, wenn Sie '!' Verwenden, fragen Sie ziemlich nach einem Absturz, also müssen Sie sich wirklich sicher sein, was Sie tun. –

Antwort

-1

Danke für die Vorschläge. Es gab kein Problem in Bezug auf die Daten, und wenn dies der Fall war, sollte kein Fehler EXC_BAD_INSTRUCTION (Code = EXCI386_INVOP, Subcode = 0X0) aufgetreten sein. Dies ist anscheinend ein Fehler in Xcode und ich werde ein Radar einreichen. Neuformulierung wie unten in Xcode funktioniert 7.3 als NSNumber als Int32 ausgepackt wird:

car.tempo = (aDict["tempo"]?.intValue)! 

Nochmals vielen Dank!

+0

Nun, nein, weil Sie geändert haben, was der Code tut, um das Problem zu vermeiden. Dies ist kein Fehler in Xcode, es ist ein Fehler in Ihrem Code, den Sie behoben haben. Bevor Sie versuchten, 'NSNumber' auf' Int32' zu reduzieren, was unmöglich ist, aber das 'as!' Erzwang das Problem, so dass der Code abstürzte. Jetzt rufen Sie 'intValue' in' NSNumber' auf, was bedeutet, dass Sie nach dem Ganzzahlwert von 'NSNumber' fragen, anstatt zu versuchen, ein Objekt auf einen primitiven Typ zu reduzieren. Übrigens ist das genau ** was @PetahChristian und ich in unseren Kommentaren beschrieben haben. –

+0

Herzlichen Glückwunsch zur doppelten Abstimmung! Ihre ursprünglichen Kommentare haben gerade gesagt, dass Ausrufezeichen gefährlich sind. Hätten Sie gesagt, dass ein Downcast von einer NSNummer zu einer Int32 unmöglich ist - andere Geschichte. Aber was Sie gesagt haben, war offensichtlich nicht hilfreich. – caxix

+0

Ich habe diese Frage oder Ihre Antwort nicht abgelehnt. In meinem Kommentar wurde "NSNumber" nicht erwähnt, da Sie nicht angegeben haben, dass Sie eine verwendet haben. Die Verwendung eines '!' Ist immer ein großes Risiko eines Absturzes, weshalb ich gesagt habe, dass Sie sicher sein müssen, was Sie getan haben. Klar warst du nicht, aber deine Codeänderung hat es behoben. Das ursprüngliche Problem ist immer noch ein Fehler in Ihrem Code und nicht in Xcode. –

0

Sie nicht Wert Adict für Schlüssel „Tempo“ gesetzt hat ...