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 42

4 ответа:

Эти типы и методы сильно изменились со времен Swift 1.

  1. префикс NS отбрасывается
  2. методы теперь выдают исключения вместо того, чтобы принимать указатель ошибки
  3. использование 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