2017-04-17 34 views
0

我有以下方法可以在從開源端點解析基本json數據時正常工作。我的問題是,在糾正編譯錯誤,我有以下行,我需要幫助理解:需要在Swift代碼中解析JSON解析

let movieDictionary = json??["Search"] as! [[String:Any]] 

爲什麼我需要有「?」 ?我想我需要'?'或'!',但爲什麼'??'?如果我刪除其中一個'?'或者替換'??'用'!',Xcode堅持要添加另一個'?',然後我的代碼編譯。

我的全方法如下:

func fetchMovies() { 
      let url = NSURL(string: "http://www.omdbapi.com/?s=batman") 
      URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in 

      if error != nil { 
       print(error) 
       return 
      } 

      do { 
       let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any]           
       let movieDictionary = json??["Search"] as! [[String:Any]] 

       for movie in movieDictionary { 
        print(movie["Title"]!) 
       } 

      } catch let jsonError { 
       print(jsonError) 
      }  
     }.resume() 
} 

回答

2

第一?try?來了。當談到一個拋出功能,你有3個選擇把它寫:

  • try:如果函數調用失敗,轉到catch
  • try?:如果函數調用失敗,返回nil也不要去catch塊。因此,返回類型爲Optional<T>
  • try!:如果函數調用失敗,崩潰的應用程序

第二?自投來了:as? [String:Any]。您要求編譯器將其轉換爲[String: Any],如果它不是可轉位的,則返回nil

如果你想擺脫他們兩個:

let url = NSURL(string: "http://www.omdbapi.com/?s=batman") 
URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in 
    guard error == nil else { 
     print(error!) 
     return 
    } 

    do { 
     guard let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any] else { 
      print("Unexpected JSON format") 
      return 
     } 
     let movieDictionary = json["Search"] as! [[String:Any]] 

     for movie in movieDictionary { 
      print(movie["Title"]!) 
     } 

    } catch let jsonError { 
     print(jsonError) 
    } 
    }.resume() 
+0

非常感謝您的解決方案! – syedfa