2016-10-10 2 views
-1

私は以下のコードでJSONをシリアライズしようとしています、ログが正常に表示名をプリントアウトするが、私はエラーでクラッシュを取得:JSONシリアライズスウィフト3

:次の行に

fatal error: unexpectedly found nil while unwrapping an Optional value

print(item["display-name"]! as!String)

Blockquoteself.tableData.append(item["display-name"] as! String)

私は理由を理解できないようですが、何か助けに感謝します!

let url = NSURL(string: "https://www.asmserver.co.uk/sally/parsexml.php")! 
 
     
 
     let task = URLSession.shared.dataTask(with: url as URL) { (data, response, error) -> Void in 
 
      
 
      
 
      
 
      if let urlContent = data { 
 
       
 
       
 
       
 
       do { 
 
        
 
        
 
        
 
        if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] { 
 
         
 
         
 
         
 
          for item in jsonResult { 
 
          
 
          
 
          print(item["display-name"]! as!String) 
 
         
 
          self.tableData.append(item["display-name"] as! String) 
 
          
 
         
 
         } 
 
         
 
        } 
 
        
 
       } catch { 
 
        
 
        print("JSON serialization failed") 
 
        
 
       } 
 
       
 
       
 
      } else { 
 
       
 
       print("ERROR FOUND HERE") 
 
      } 
 
      
 
      
 
      DispatchQueue.main.async(execute: {() -> Void in 
 
       
 
       self.tableView.reloadData() 
 
       
 
      }) 
 
      
 
      self.tableView.isUserInteractionEnabled = true 
 
      
 
      
 
     } 
 
     
 
     task.resume()

答えて

1

あなたは、あなたがそれを使用して、特別にas!を使用する前に、前にあなたが本当に価値を持っていることを確認してください。ガードは、あなたが値を持っているとname変数を使用することができます成功した場合

for item in jsonResult { 
    guard let name = item["display-name"] as? String else { continue } 
    print(name) 
    self.tableData.append(name) 
} 

ではなく、次のように行います。 guardステートメントにいくつかの条件を追加することもできます。

+1

華麗ありがとう!期限が過ぎると、悪い印をつける – MattBlack

1

ガード書に代わるものとして、あなたはまた、同様のif let構文を使用できます。

if let item = item["display-name"] as? String { 
    print(item) 
} else { 
    print("No display name") 
}