将 json 和 HTTP“post”代码转换为 Swift 3 时出错
Posted
技术标签:
【中文标题】将 json 和 HTTP“post”代码转换为 Swift 3 时出错【英文标题】:Errors while converting json and HTTP "post" code to Swift 3 【发布时间】:2016-11-04 09:27:48 【问题描述】:我正在尝试将旧代码从教程转换为 Swift 3,因为我目前正在处理的项目已经在 Swift 3 中。我在发送 POST 请求和读取收到的 JSON 时遇到问题。请注意,这些屏幕截图是从视频中截取的,因此某些代码可能会重复。
我的代码如下:
let myURL = NSURL(string:"http://localhost/bahApp/scripts/registerUser.php?");
let request = NSMutableURLRequest(url:myURL as! URL)
request.httpMethod = "POST";
let postString = "userEmail=\(userEmail)&userPassword=\(userPassword)&userFirstName=\(userFirstName)&userLastName=\(userLastName)&numberOfConnections=\(numberOfConnections)&installerID=\(installerID)"
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: myURL as URL!) data, response, error in
DispatchQueue.main.async
if error != nil
self.displayAlertMessage(userMessage: (error?.localizedDescription)!)
return
do
if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any]
print(jsonResult)
catch let error as NSError
print(error.localizedDescription)
let parseJSON = jsonResult as? NSDictionary
var userId = parseJSON["userID"] as? String
if (userId != nil)
var myAlert = UIAlertController(title: "Alert", message: "registration successful", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
else
let errorMessage = parseJSON["message"] as? String
if (errorMessage != nil)
self.displayAlertMessage(userMessage: errorMessage!)
task.resume()
func displayAlertMessage(userMessage: String)
var myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
我想知道我是否正确转换了大部分代码以及如何修复如下屏幕截图所示的错误:
我对此进行了广泛的搜索,唯一能有所帮助的帖子是this post
【问题讨论】:
"let parseJSON = jsonResult as?NSDictionary " 不是有效的 Swift 代码,尝试将其更改为 "if let parseJSON = jsonResult as?NSDictionary " @sealos 谢谢,当我将其更改为它时,它会给出错误“使用未解析的标识符'jsonResult'” jsonResult 声明位于 do 块内。请给我一分钟时间来编写修复程序。 【参考方案1】:您的代码正在尝试使用在范围外访问的实例。这是由于 do 块内的声明而发生的。试试下面的代码:
let task = URLSession.shared.dataTask(with: myURL as URL!) data, response, error in
DispatchQueue.main.async
if let error = error
self.displayAlertMessage(userMessage:(error.localizedDescription)!)
return
let jsonResult: [String:Any]?
do
jsonResult = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any]
if let result = jsonResult
print(result)
catch let error as NSError
print(error.localizedDescription)
if let parseJSON = jsonResult as? NSDictionary
if let userId = parseJSON["userID"] as? String
var myAlert = UIAlertController(title: "Alert", message: "registration successful", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
else
if let errorMessage = parseJSON["message"] as? String
self.displayAlertMessage(userMessage: errorMessage!)
【讨论】:
【参考方案2】:您忘记在let parseJSON
之前添加if
。
if let parseJSON = jsonResult as? NSDictionary
//...
【讨论】:
我有你说的,当我改变它时,它给出了错误“使用未解析的标识符'jsonResult'” 你应该把这段代码移到包含if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any] print(jsonResult)
的行下面
帮助很大,谢谢你,我赞成,但因为我低于 15 代表它不显示以上是关于将 json 和 HTTP“post”代码转换为 Swift 3 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何将 JSON 转换为 Swift Dictionary 以进行 HTTP POST
如何在 Django 中将 Http Post 参数的 Json 值转换为 Python 字典?
使用 jQuery 发布 JSON 后,将字符串转换回 JSON