2017-01-23 75 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的情况。