2016-03-08 88 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)") 
    } 
}