swift Программирование nserrorpointer ошибка и т. д
var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: error) as NSDictionary;
Эта строка кода дает мне ошибку
NSError is not convertable to NSErrorPointer.
Поэтому я решил изменить код на:
var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary;
, который превратит ошибку NSError в NSErrorPointer. Но затем я получаю новую ошибку и не могу понять ее смысла:
NSError! is not a subtype of '@|value ST4'
4 ответа:
Эти типы и методы сильно изменились со времен Swift 1.
- префикс
NS
отбрасывается- методы теперь выдают исключения вместо того, чтобы принимать указатель ошибки
- использование NSDictionary не рекомендуется. Вместо этого используйте словарь Swift
Это приводит к следующему коду:
do { let object = try JSONSerialization.jsonObject( with: responseData, options: .allowFragments) if let dictionary = object as? [String:Any] { // do something with the dictionary } else { print("Response data is not a dictionary") } } catch { print("Error parsing response data: \(error)") }
Of, если вас не волнует конкретная ошибка синтаксического анализа:
let object = try JSONSerialization.jsonObject( with: responseData, options: .allowFragments) if let dictionary = object as? [String:Any] { // do something with the dictionary } else { print("Response data is not a dictionary") }
Оригинальный Ответ
Ваш NSError должен быть определен как an
Optional
, потому что он может быть равен нулю:var error: NSError?
Вы также хотите учесть наличие ошибки в синтаксическом анализе, которая вернет
nil
или синтаксический анализ, возвращающий массив. Для этого мы можем использовать опциональное приведение с операторомas?
.Это оставляет нас с полным кодом:
var possibleData = NSJSONSerialization.JSONObjectWithData( responseData, options:NSJSONReadingOptions.AllowFragments, error: &error ) as? NSDictionary; if let actualError = error { println("An Error Occurred: \(actualError)") } else if let data = possibleData { // do something with the returned data }
Как уже упоминалось, ошибка должна быть определена как необязательная (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/AdoptingCocoaDesignPatterns.html)
Однако-этот код будет аварийно завершаться, если есть ошибка и возвращается nil," как NSDictionary " будет виновником:
var data: NSDictionary = NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary;
Вам нужно выполнить синтаксический анализ json следующим образом:
var jsonError : NSError? let jsonResult : AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &jsonError) if let error = jsonError{ println("error occurred: \(error.localizedDescription)") } else if let jsonDict = jsonResult as? NSDictionary{ println("json is dictionary \(jsonDict)") } else if let jsonArray = jsonResult as? NSArray{ println("json is an array: \(jsonArray)") }
Это сработает. Также помните, что json может вернуться в виде массива. Вместо того чтобы пройти ноль для вариантов вы можете передать все, что вам нравится, например:
NSJSONReadingOptions.AllowFragments
Если хотите.
Теперь в бета-3
var error: AutoreleasingUnsafePointer<NSError?> = nil var data: NSDictionary = NSJSONSerialization.JSONObjectWithData( w, options:.AllowFragments, error: error ) as NSDictionary;
Проверьте с помощью кода ниже:
var error: AutoreleasingUnsafePointer<NSErrorPointer?>=nil var dataVal: NSData = NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil) var err: NSError? var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary println("Result\(jsonResult)")
Попробуйте использовать
var error: AutoreleasingUnsafePointer<NSErrorPointer?>=nil