2016-10-13 5 views
-1

So habe ich eine unglaublich frustrierende Situation, wenn ich Daten aus der API meines Unternehmens konsumiere. Wenn ich nämlich einen Wert verwende, von dem ich erwarte, dass er ein Int ist (und ein Int wird vom Backend heruntergesendet), verwenden wir als Beispiel "userID", wird es doppelt in ein optionales Format eingeschlossen. Ich versuche, es in einen explizit ausgepackten Int Wert zu drehen (var userID : Int!), so dass, wenn ich es von der API nehme ich mache die self.userID = responseObject["id"] as! Int aber sobald ich es ausdrucken ich dieses in LLDBWerte, die zweimal in Optionals verpackt werden

Optional<Int> 
- some : 7575235 

so, wenn ich versuche, dies in einen String drehen diesen

Optional<String> 
- some : "Optional(7575235)" 

wird ... das war unglaublich frustrierend, wenn ich po responseObject["id"] as! Int in der Konsole zu tun, gibt es das, was ich würde erwarten, dass es sein, das ist 7.575.235, vollständig ausgepackt . Ich weiß nicht, warum, wenn ich es einmal in die Instanzvariable geschrieben habe, es wieder einpackt, zumal es explizit ausgepackt ist. Das hat unglaublich frustrierend, so dass jede Hilfe wird sehr geschätzt

+0

Was ist der Typ von responseObject? [Zeichenfolge: AnyObject]? – BJHStudios

Antwort

2

Ich weiß nicht, warum, wenn ich es in der Instanzvariable legte sie es wieder wickelt zurück, zumal es ausdrücklich

Sie sind ausgepackt ist derjenige, der es wieder eingewickelt zurück durch Eingabe von als Int!. Ein implizit unverpacktes Optional ist ein Optional. eine Int eines optionalen Int zuordnen wickelt es in der Fakultativ oben - und das ist genau das, was du getan hast, als du sagtest

self.userID = responseObject["id"] as! Int 

Siehst du? responseObject["id"] as! Int ist ein Int, ja; aber self.userID selbst ist ein optionales Wrapping ein Int, so dass die Zuweisung der Int in ein Optional Wrapped.

Alles, was es bedeutet, für eine optionale implizit ausgepackt zu sein, ist, dass, wenn Sie verwenden es, wo seine umschlossenen Typ erwartet wird, es wird ausgepackt werden. Zum Beispiel könnten Sie self.userID übergeben, wo Int erwartet wird, und es wird ausgepackt, damit Sie das umschlossene Int abrufen können. Aber wenn Sie fragen, was es eigentlich ist, wie Sie in lldb tun, warum dann, es ist ein Optional - weil Sie machte es zu einem Optional.

+0

Ich sehe das, ich denke, dass mein grundlegendes Missverständnis von der Idee explizit ausgepackter optionals kommt .... Ich dachte, dass, wann immer Sie sie verwenden, sie bereits ausgepackt sind, wenn ich 'userID' als Int !, wann immer ich erkläre es muss ich es nicht explizit auspacken, daher die explizit unverpackte optionale Bezeichnung – Coach

+0

Richtig. Ich vermutete, dass dies dein Missverständnis war, weshalb ich versuchte, es in meiner Antwort so ausführlich zu formulieren. Manchmal ist unser Verstand wie ein schlecht funktionierendes Gerät, und Sie müssen es nur auf die Seite schlagen, damit es richtig funktioniert! - Um ehrlich zu sein versucht Apple, implizit ausgepackte Optionals vollständig auslaufen zu lassen. Ihr Zweck war in den frühen Tagen wirklich als Notlösung, bevor die Cocoa APIs angepasst wurden.Sie sollten aufhören, sie zu benutzen. Sie machen dich nur faul. :) - Siehe auch mein Buch: http://www.apeth.com/swiftBook/ch03.html#_implicitly_unwrapped_optional – matt

+0

"implizite Unwrapping wird nicht durch Zuweisung weitergegeben." ... genau das habe ich falsch verstanden. Dieses Kapitel in Ihrem Buch ist ungöttlich hilfreich, vielen Dank. Jeder sollte das für Swift 3 lesen, da diese Änderung in der Verwendung eine wesentliche Quelle der Frustration für mich war – Coach

0

versuchen dies zu tun: -

var userID = 0 

self.userID = responseObject["id"] as! Int 
let stringValue = String(self.userID) 

Das Problem hier ist, dass Int ist kein Objekt-Typ, so dass Sie es mit einem Wert initialisiert werden müssen.

Verwandte Themen