swift中do catch的范围-无法为外部变量赋值

swift中do catch的范围-无法为外部变量赋值,swift,scope,swift2,nsjsonserialization,do-catch,Swift,Scope,Swift2,Nsjsonserialization,Do Catch,我已经编写了一些代码,对放置在服务器上的php脚本发出POST请求。我已经测试过了,那部分工作正常。我从服务器返回结果时遇到了问题-我以JSON格式获取结果,并在内部do catch语句中打印-没问题。我将返回变量赋值给在do catch之外声明的变量,该变量不“可见”。让我展示我的代码,当您看到代码时,解释会更简单: //sending inputs to server and receiving info from server let json:[String:AnyObject]

我已经编写了一些代码,对放置在服务器上的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(“第一次打印->\(结果![“密码”])”)
,它将正常执行并输出所有变量。然后,如果在代码末尾看到
print(“SECOND print->\(novi)”)
,它会输出空的sting,就像我没有给它赋值一样

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


此问题不是do catch的问题,而是异步问题。

这是“dataTaskWithRequest异步执行”问题的另一个变体,与do catch无关。我刚刚为您修改了答案。请看一下这个代码。阿尔文-我如何调用函数,完成对我来说是新的东西