2016-03-08 87 views
0

我是新来的Swift 2.0,但我有OOP语言的经验。我试图通过JSON API在标签中显示城市的名称。但是我经常得到错误“EXC_BAD_INSTRUCTION”和“Unwrapping nil”错误。我认为这个问题可能在URL中。因为我已经尝试过使用另一个API,radnomuser.me/api,并且我得到的结果没有错误。有人可以让我解决问题,因为我在互联网上得到了很多答案,而且他们都不一样。如果您不了解我的问题,请随时提问,因为我认为这是至关重要的部分。 谢谢!所有的Swift 2解析和阅读JSON

@IBOutlet weak var viaSegueTextView: UITextView!{ 

var viaSegue = "" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    getWeatherData() 



} 

////////////////////////////////////////////////////////////////////////// 
func getWeatherData { 
    let endpoint = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=44db6a862fba0b067b1930da0d769e98") 
    let data = NSData(contentsOfURL: endpoint!) 

    do { 
     if let json: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary { 
      if let name = json["name"] as? String 
      { 

        viaSegueLabel.text = "\(name)" 

      } 
     } 
    }catch let error as NSError{ 
     print("\(error)") 
    } 
    } 
} 
+1

解析和阅读很好。你的'viaSegueLabel'是零。我在Playground中尝试了你的下载/解析片段,并且解析得很好。也为下一次 - 不要** EVER **张贴您的应用程序ID,登录名等... – Michal

+0

感谢您的提示,它只是测试应用程序,只是阅读JSON和显示数据,但我明白你的意思。 我还是不明白。我知道我没有,这意味着我没有得到JSON的价值。出于某种原因,它在“if”之前停止,viaSequeLabel为零,因为它没有解析它,或者因为URL是错误的或其他的东西? 感谢您的回复。 – Srdjan

+0

这不是问题,但'JSONObjectWithData'不返回一个可选项,所以可选的绑定是无用的。写'让json =尝试NSJSONSerialization.JSONObjectWithData(jsonData,options:[])as! [String:AnyObject]',如果发生错误,catch块将被执行 – vadian

回答

1
import Foundation 

func getWeatherData() { 
    guard let endpoint = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=44db6a862fba0b067b1930da0d769e98"), 
     let data = NSData(contentsOfURL: endpoint) else { return } 

    do { 
     if let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary { 
      if let name = json["name"] as? String { 
       print(name) // London 
      } 
     } 
    } catch let error as NSError{ 
     print("\(error)") 
    } 
} 
getWeatherData() // prints 
// London 
1
  • 首先,你必须在InterfaceBuilder中链接您IBOutlet中。这可能是第一个可以解开nil错误的地方。
  • 第二点,viewDidLoad是一个视图控制器的方法,我不明白为什么你的括号在UITextView之后。
  • 第三,你的代码中没有声明viaSegueLabel。
  • 第四,尽量不要强迫打开这么多的可选项(使用!)并使用,如果让反而。
  • 对于第一次迭代我想改变getWeatherData方法是这样的:

    func getWeatherData() { 
        let endpoint = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=44db6a862fba0b067b1930da0d769e98") 
        if let endpoint = endpoint, data = NSData(contentsOfURL: endpoint) { 
         do { 
          if let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary { 
           if let name = json["name"] as? String 
           { 
            print(name) 
           } 
          } 
         } catch let error as NSError{ 
          print("\(error)") 
         } 
        } 
    } 
    
+0

对不起,错误的变量声明,viaSegueLabel是一个插座,它被声明,但我写错了。我试过不强迫它,但Xcode迫使我这样做。 感谢您的回答。 – Srdjan

+0

感谢您的帮助!得到它了!它工作得很好。 – Srdjan

+0

不客气!很高兴我能帮上忙。 – Ionut

1

SWIFT 3

FUNC WeatherData() { 后卫让端点= NSURL(串:“http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=44db6a862fba0b067b1930da0d769e98”), let data = NSData(contentsOf:endpoint as URL)else {return}

do { 
     if let json = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary { 
      if let weather = json["weather"] as? NSDictionary { 
       print(weather) // London 
      } 
     } 
    } catch let error as NSError{ 
     print("\(error)") 
    } 
}