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

问题描述:

我已经提出了一些代码来向我的php脚本发出POST请求,这些脚本放置在我的服务器上。我已经测试过,那部分工作正常。我从服务器返回结果时遇到了问题 - 我以JSON格式获取它,并在内部do-catch语句中打印 - 它正常。我将返回变量赋值给在do-catch之外声明并且不是“visible”的变量。让我告诉我的代码,这将是更simplier解释,当你看到代码:swift中的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)"),它会输出空的刺痛 - 就像我没有为其分配变量一样。

+2

这是“dataTaskWithRequest异步执行”问题的另一种变体,与do-catch无关。 –

+0

我刚刚修改了你的答案。请看看这段代码。 http://www.wepaste.com/Alvin%20Varghese/ –

+0

Alvin - 我如何调用函数,完成对我而言是新事物 –

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

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