2017-06-04 82 views
0

我试图创建一个使用斯威夫特3.一个简单的getJSON功能我得到的问题是,我不断收到错误变量“JSON”正在初始化之前关闭捕捉

变量“JSON”在初始化之前通过关闭捕获

我是Swift的新手,对于为什么我无法声明变量并在随后的道路上为其指定值,我感到非常困惑。看起来好像我所做的一切都是正确的,但它不起作用。

这里是我的功能:

func getJson(url: String) -> AnyObject { 
    var json:AnyObject 
    let url = URL(string: url) 
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     if error != nil { 
      print("Error"); 
     } else { 
      if let content = data { 
       do { 
        // Convert JSON to array 
        json = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 
       } catch { 

       } 
      } 
     } 
    } 
    task.resume(); 
    return json 
} 

任何帮助都将是巨大的,谢谢!

+3

您正在声明'json':'var json:AnyObject',但是在捕获之前不要初始化它。除此之外,你的代码根本不起作用,因为'dataTask'异步工作。顺便说一句:在Swift 3中,未指定的JSON类型是“Any”。 – vadian

回答

0

在代码中有很多事情需要纠正。

1)我建议您使用外部软件包,如Alamofire 用于http请求,SwiftyJSON用于json解析。当你尝试自己处理这些东西时,它会让你的代码更容易出错。

2)最好是声明你的json变量为Any,因为未指定的JSON类型是Any

3)您已经声明了一个名为json的变量,但尚未初始化它。最好将其声明为var json: Any?之类的可选项。如果您不想将其声明为可选项,则可以定义默认值var json: Any = [:] as Any

4)您正在线程中运行您的请求,但函数在线程完成其作业之前正在返回。你的函数不需要返回值。你可以用两种不同的方式处理响应json。 a)你可以传递一个函数给你的请求并传递响应。 b)您可以使用NotifcationCenter并在请求完成时发送通知。