2016-11-18 47 views
0

我正在研究swift和我更新xcode到當前版本(8.1)。所以我保存的來源被改變了。當我運行代碼時。它破解了,我無法修復它。它在最後一行顯示「EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)」。這是我從網上學習的代碼。 非常感謝。我無法修復EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子代碼= 0x0)在斯沃夫特xcode 8.1在JSON

let urlString = "http://swapi.co/api/people/1/" 
let session = URLSession.shared 
let url = URL(string: urlString)! 

session.dataTask(with: url, completionHandler: { (data: Data?, response:URLResponse?, error: NSError?) -> Void in 

if let responseData = data { 

    do { 
     let json = try JSONSerialization.jsonObject(with: responseData, options: JSONSerialization.ReadingOptions.allowFragments) 

     if let dict = json as? Dictionary<String, AnyObject> { 

      if let name = dict["name"] as? String, let height = dict["height"] as? String, let birth = dict["birth_year"] as? String, let hair = dict["hair_color"] as? String { 

       let person = SWPerson(name: name, height: height, birthYear: birth, hairColor: hair) 

       print(person.name) 
       print(person.height) 
       print(person.hairColor) 
       print(person.birthYear) 

       if let films = dict["films"] as? [String] { 
        for film in films { 
         print(film) 
        } 
       } 

      } 
     } 


    } catch { 
     print("Could not serialize") 
    } 
    } 
} as! (Data?, URLResponse?, Error?) -> Void) .resume() 

回答

0

你可以節省很多時間,如果你簡單地閱讀文檔

  • ⇧⌘0(零,而不是O)
  • 類型dataTask,選擇dataTask(with:completionHandler:)並按回報

你會得到

func dataTask(with url: URL, 
    completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask 

你看到error參數略有區別?

所以在代碼中正確的語法是

session.dataTask(with: url, completionHandler: { (data: Data?, response:URLResponse?, error: Error?) -> Void in 
... 
}).resume() 

有結尾沒有類型轉換。

此外,完成塊中的類型註釋不需要,因爲編譯器會推斷類型。如果你只寫

session.dataTask(with: url, completionHandler: { (data, response, error) in 
... 
}).resume() 

最短的形式使用尾隨閉包語法

session.dataTask(with: url) { (data, response, error) in 
... 
}.resume() 
不會發生錯誤
相關問題