Подтвердить что ты не робот

Быстрое программирование ошибки 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'
4b9b3361

Ответ 1

Ваш NSError должен быть определен как Optional, потому что он может быть nil:

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
}

Ответ 2

Как уже упоминалось, ошибка должна быть определена как необязательная (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/AdoptingCocoaDesignPatterns.html)

Однако - этот код БУДЕТ ЗАПРЕЩАЕТСЯ, если возникла ошибка, и nil возвращается, "As 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

Теперь в бета-3

var error: AutoreleasingUnsafePointer<NSError?> = nil

var data: NSDictionary = NSJSONSerialization.JSONObjectWithData( w, options:.AllowFragments, error: error ) as NSDictionary;

Ответ 4

Проверить С помощью кода ниже:

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