【问题标题】:scope of do-catch in swift - cannot assign value to outside variable [duplicate]swift中do-catch的范围-无法将值分配给外部变量[重复]
【发布时间】:2016-07-10 19:04:42
【问题描述】:

我已经编写了一些代码来向我放置在我的服务器上的 php 脚本发出 POST 请求。我已经测试过了,那部分工作正常。我遇到了服务器返回结果的问题 - 我以 JSON 格式获取它,并在 do-catch 语句中打印 - 没关系。我将返回变量分配给在 do-catch 之外声明且不“可见”的变量。让我展示一下我的代码,看到代码解释起来会更简单:

//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)"),它会输出空字符串——就像我没有为它分配变量一样。

【问题讨论】:

  • 这是“dataTaskWithRequest 异步执行”问题的另一种变体,与 do-catch 无关。
  • 我刚刚为你修改了答案。请看一下这段代码。 wepaste.com/Alvin%20Varghese
  • Alvin - 我如何调用函数,完成对我来说是新事物

标签: swift scope swift2 nsjsonserialization do-catch


【解决方案1】:

您正在使用异步块。 print 语句将在您的块有机会设置 novi 之前运行。

这个问题不是 do-catch 的问题,它是一个异步问题。

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多