2016-11-18 48 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() 
不会发生错误
相关问题