2017-01-23 5 views
-1

Ich benutze Vapor für Swift Backend. Im Folgenden ist der Code, mit dem ich arbeite.Swift 3 optionale Zeichenfolge zu int

drop.post("postTodo") { request in 

var jsonContent: JSON? 
if let contentType = request.headers["Content-Type"], contentType.contains("application/json"), let jsonData = request.json { 
    jsonContent = jsonData 
    print("Got JSON: \(jsonContent)") 
} 


guard let id = jsonContent?.node.object?["id"]?.string 
    else { 
     return JSON(["message": "Please include mandatory parameters"]) 
} 

let tempId = Int(id)! 

Ich bin "id" als optionale Zeichenfolge für zB bekommen:? Optional ("123") für jsonContent .node.object [ "id"] ?. String

Wenn ich versuche, um es mit int (id) in int zu konvertieren! Ich bekomme zurück Null Wenn ich versuche zu tun, lassen Sie tempId = Int (id!) gibt es einen Fehler.

Aber wenn ich das gleiche im Spielplatz mache, bekomme ich richtigen int-Wert.

Warum optionale Zeichenfolge zu Int funktioniert nicht richtig in meiner Vapor-App? Irgendeine Idee.

+0

Erste Vermutung ist, dass "ID" ist schon ein Int ... versuchen, nicht zu String an erster Stelle zu konvertieren? – brandonscript

+0

Ersetzen Sie "let tempId = Int (id)!" Durch "let tempId = Int (id)". – shallowThought

+0

Wie bekomme ich Int von Json Node-Objekt? denn wenn ich jsonContent node.object nenne? ["id"]? int gibt es nil und wenn ich jsonContent node.object nenne? ["id"]? dann wird es Node.Node-Objekt geben. – Tarang

Antwort

1

Wenn "id" eine optionale Zeichenfolge ist, dann möchten Sie wahrscheinlich nicht zwangsweise mit dem "!" Auspacken.

Die sicherste Methode so etwas wie wäre:

if let id = id 
{ 
    let myIdAsInt = Int(id) 
} 

Der Grund, es „funktioniert“ auf dem Spielplatz, auf jeden Fall ist ist ein Nicht-Null-Wert an den Zeichenfolge zuweisen (also erhalten Sie weg mit der Kraft auspacken).

+0

Danke für die Antwort. – Tarang

1

String!
könnte eine Zeichenfolge enthalten, oder es könnte Null enthalten. Es ist wie ein normales optionales, aber Swift lässt Sie direkt auf den Wert zugreifen, ohne die Unwrapping-Sicherheit. Wenn Sie versuchen, es zu tun, bedeutet es, dass Sie wissen, dass dort ein Wert ist - , aber wenn Sie falsch liegen, stürzt Ihre App ab.

var optionalString: String? = "123" 

// first check if it doesn't contain nil 
if let str = optionalString { 
    // string to -> Int 
    if let id = Int(str) { 
     print(id) // work with id 
    } 
} else { 
    // optionalString contains nil 
} 
+0

Danke für die Antwort – Tarang

1

was i i Coz, von denen ein struct mit optionalen Eigenschaften hatte in meinem iOS-Code gefunden, wenn abzubildenden Dict mit optionalen Werten Schlüssel Objekt gab.

Wenn ich Eigenschaften nicht optional mache und es an Dampf-Backend senden, nachdem es gut funktioniert.

Also im Grunde war es der Fall der Optionals richtig zu verwenden.