2017-09-26 75 views
1

我想创建一个天气应用程序,为了做到这一点,我需要解析出JSON。这可以工作,(我知道是因为我通过打印测试过),但是我无法改变我得到的数据的值到一个已经初始化的全局变量。之前有人问过类似的问题,但即使使用提供的答案,我也无法解决自己的问题。如何更改函数中全局变量的值以便稍后使用?

以下行是我初始化我的全局变量:

var currentTemperature = 88 
var currentTime = 789 

而下面行是我解析JSON和测试在我viewDidLoad中功能打印:

let url = URL(string: "https://api.darksky.net/forecast/c269e5928cbdadde5e9d4040a5bd4833/42.1784,-87.9979") 

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 

     if error != nil { 
      print("error") 
     } 
     else { 

      if let content = data { 

       do { 

        let json = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 

        if let jsonCurrently = json["currently"] as? NSDictionary { 

         if let jsonCurrentTime = jsonCurrently["time"] { 

          currentTime = jsonCurrentTime as! Int 
          print(currentTime) 

         } 

         if let jsonCurrentTemperature = jsonCurrently["temperature"] { 

          currentTemperature = jsonCurrentTemperature as! Int 
          print(currentTemperature) 


         } 



        } 

       } catch { 

       } 

      } 

     } 

    } 

    task.resume() 

我用在不同的类中设置标签文本时的全局变量:(但是,只有初始值设置为变量,而不是来自解析的JSON的初始值)

let currentTemperatureLabel: UILabel = { 
    //label of the current temperature 
    let label = UILabel() 
    label.text = String(currentTemperature) + "°" 
    label.textColor = UIColor(red: 150/255, green: 15/255, blue: 15/255, alpha: 0.8) 
    label.textAlignment = NSTextAlignment.center 
    label.font = UIFont(name: "Damascus", size: 130) 
    label.font = UIFont.systemFont(ofSize: 130, weight: UIFontWeightLight) 
    return label 
}() 

的JSON例如要求可以在这里找到:https://darksky.net/dev/docs#api-request-types

不管我做什么,我不能够从JSON使用数据时,我试图访问之前提到的两个全局变量。

+0

的部分评论的答案是,所有你正在做的初始化的全局变量?你把它们存储在一个静态实例中吗?你以后如何访问它们? –

+0

你可以展示你解析的JSON的例子吗? – ColGraff

+0

由于我是Xcode的新手,我真的不知道如何回答Shamas的第2个问题,但我更新了帖子以回答第三个问题并回答ColGraff的问题。 –

回答

2
var currentTemperature : Double = 88 
var currentTime = 789 

//... 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let url = URL(string: "https://api.darksky.net/forecast/c269e5928cbdadde5e9d4040a5bd4833/42.1784,-87.9979") 

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 

     if error != nil { 
      print("error") 
     } 
     else { 

      if let content = data { 

       do { 

        let json = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 

        if let jsonCurrently = json["currently"] as? NSDictionary { 

         if let jsonCurrentTime = jsonCurrently["time"] as? Int { 

          currentTime = jsonCurrentTime 
          print(currentTime) 

         } 

         if let jsonCurrentTemperature = jsonCurrently["temperature"] as? Double { 

          currentTemperature = jsonCurrentTemperature 
          print(currentTemperature) 


         } 



        } 

       } catch { 

       } 

      } 

     } 

    } 

    task.resume() 
} 

我没有这些编辑上面的代码:

  • 改变了你的currentTemperature是双(看看你的JSON响应,看看你会得到什么样的反应,什么样的数据类型,可以定)
  • 当试图使分配给你的变量时得到“时间”和“温度”添加可选的包装内,以从正确的数据类型的响应正确获取数据,你不会需要做明确的展开

编辑: 更新基于你对全局变量不是类

+0

谢谢你的回答,但是,我想你误解了我的问题。当我说全局变量时,我的意思是没有在特定类中初始化的变量,而是在类之外进行初始化。我认为出于这个原因,当我使用“自我”的时候,我得到一个错误,因为这些变量不存在于类内,因此意味着我不能使用“自我”。此外,如果不清楚,打印语句只包括我为了测试问题是否与解析JSON或变量(我意识到问题是与变量)。 –

+0

是的,我很了解打印语句是你调试的目的,但是如果这两个变量是不是类(我认为它是类的一部分),那么上面我贴仍然是代码应工作的一部分而言全局变量,只是删除自(见编辑),因为我在操场测试这个问题,以及 –

+0

OK了,仍能正常工作,但由于某种原因,如果我在我的viewDidLoad功能,即打印currentTemperature的结尾处添加一个print语句,它最终还是印刷currentTemperature的原始值(88),即使JSON解析打印正确的值内的两个打印语句。 –

相关问题