2017-01-23 71 views
-1

我正在使用Vapor作爲Swift後端。以下是我正在使用的代碼。Swift 3可選字符串到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)! 

我收到 「ID」,作爲如可選字符串:??可選的jsonContent .node.object( 「123」)[ 「ID」] ?.串

當我嘗試使用Int(id)將其轉換爲int!我回來 如果我嘗試讓tempId = Int(id!)它會給出錯誤。

但是當我在操場上做同樣的事情時,我得到了正確的int值。

let id: String? 

id = "1234" 

let myInt = Int(id!) 

爲什麼可選字符串到Int在我的Vapor應用程序中無法正常工作? 任何想法。

+0

第一個猜測是'id'已經是一個Int ...嘗試不首先轉換爲字符串? – brandonscript

+0

用'let tempId = Int(id)'替換'let tempId = Int(id)!'。 – shallowThought

+0

那麼我如何從json節點對象獲取int?因爲如果我調用jsonContent?.node.object?[「id」]?。int它會給零,如果我打電話給jsonContent?.node.object?[「id」]?那麼它會給Node.Node對象。 – Tarang

回答

1

如果「id」是一個可選字符串,那麼你可能不希望強制使用「!」來展開它。

最安全的方法是這樣的:

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

它之所以「工程」在操場上,是你肯定在列指定一個非空值(因此你得逞的力量解包)。

+0

感謝您的回答。 – Tarang

1

String!
可能包含一個字符串,或者它可能包含零。這就像一個普通的可選項,但Swift可以讓你直接訪問值而不需要解包安全。如果你嘗試這樣做,這意味着你知道這裏有價值 - 但是如果你錯了,你的應用會崩潰

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

感謝您的回覆 – Tarang

1

我發現在我的iOS的代碼,我曾與可選特性struct堂妹其中當映射到快譯通給對象與可選值的鍵。

如果我讓屬性不是可選的,並且在它正常工作後將它發送到蒸氣後端。

所以基本上是正確使用Optionals的情況。