swift 中的 do-catch 范围 - 无法为外部变量赋值
scope of do-catch in swift - cannot assign value to outside variable
我编写了一些代码来向我的服务器上的 php 脚本发出 POST 请求。我已经测试过,那部分工作正常。我从服务器返回的结果中遇到问题 - 我以 JSON 格式获取它,并在内部 do-catch 语句中打印 - 没问题。我将返回变量分配给在 do-catch 之外声明的变量,而不是 "visible"。让我展示一下我的代码,当你看到代码时解释起来会更简单:
//sending inputs to server and receiving info from server
let json:[String:AnyObject] = [ "username" : username!, "password" : password!, "iphone" : "1" ]
var link = "http://www.pnc.hr/rfid/login.php"
var novi:String = ""
do {
let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted)
// create post request
let url = NSURL(string: link)!
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
// insert json data to the request
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.HTTPBody = jsonData
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in
if error != nil{
print("Error 55 -> \(error)")
return
}
do {
let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject]
print("FIRST PRINT -> \(result!["password"])")
novi = String(result!["password"])
//return result
} catch {
print("Error 43-> \(error)")
}
}
task.resume()
}
catch {
//handle error. Probably return or mark function as throws
print(error)
}
print("SECOND PRINT -> \(novi)")
如果您看到 print("FIRST PRINT -> \(result!["password"])")
- 它正常执行并输出所有变量。然后,如果您在代码末尾看到 print("SECOND PRINT -> \(novi)")
,它会输出空字符串 - 就像我没有为它分配变量一样。
您正在使用异步块。在您的块有机会设置 novi.
之前,打印语句将得到 运行
这个问题不是 do-catch 的问题,而是一个异步问题。
我编写了一些代码来向我的服务器上的 php 脚本发出 POST 请求。我已经测试过,那部分工作正常。我从服务器返回的结果中遇到问题 - 我以 JSON 格式获取它,并在内部 do-catch 语句中打印 - 没问题。我将返回变量分配给在 do-catch 之外声明的变量,而不是 "visible"。让我展示一下我的代码,当你看到代码时解释起来会更简单:
//sending inputs to server and receiving info from server
let json:[String:AnyObject] = [ "username" : username!, "password" : password!, "iphone" : "1" ]
var link = "http://www.pnc.hr/rfid/login.php"
var novi:String = ""
do {
let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted)
// create post request
let url = NSURL(string: link)!
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
// insert json data to the request
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.HTTPBody = jsonData
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in
if error != nil{
print("Error 55 -> \(error)")
return
}
do {
let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject]
print("FIRST PRINT -> \(result!["password"])")
novi = String(result!["password"])
//return result
} catch {
print("Error 43-> \(error)")
}
}
task.resume()
}
catch {
//handle error. Probably return or mark function as throws
print(error)
}
print("SECOND PRINT -> \(novi)")
如果您看到 print("FIRST PRINT -> \(result!["password"])")
- 它正常执行并输出所有变量。然后,如果您在代码末尾看到 print("SECOND PRINT -> \(novi)")
,它会输出空字符串 - 就像我没有为它分配变量一样。
您正在使用异步块。在您的块有机会设置 novi.
之前,打印语句将得到 运行这个问题不是 do-catch 的问题,而是一个异步问题。