2017-06-04 39 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並在請求完成時發送通知。