swift xcode6 nserror

swift - error de programación rápida de NSErrorPointer, etc.



xcode6 (4)

Verifique con el siguiente código:

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)")

Intenta usar

var error: AutoreleasingUnsafePointer<NSErrorPointer?>=nil

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

Esta línea de código me da error

NSError is not convertable to NSErrorPointer.

Entonces pensé en cambiar el código a:

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

que convertiría el error NSError en un NSErrorPointer. Pero luego aparece un nuevo error y no puedo encontrarle sentido:

NSError! is not a subtype of ''@|value ST4''


Como se mencionó, el error debe definirse como opcional ( https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/AdoptingCocoaDesignPatterns.html )

Sin embargo, este código CRASH si hay un error y se devuelve nil, el "As NSDictionary" sería el culpable:

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

Debes hacer el análisis json de esta manera:

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)") }

Que funcionará. También recuerde que json puede regresar como una matriz. En lugar de pasar cero por las opciones puede pasar lo que quiera, por ejemplo:

NSJSONReadingOptions.AllowFragments

Si te gusta.


Ahora en beta-3

var error: AutoreleasingUnsafePointer<NSError?> = nil var data: NSDictionary = NSJSONSerialization.JSONObjectWithData( w, options:.AllowFragments, error: error ) as NSDictionary;


Su NSError debe definirse como Optional porque puede ser nulo:

var error: NSError?

También desea dar cuenta de que hay un error en el análisis que devolverá nil o el análisis regresará una matriz. Para hacer eso, podemos usar un casting opcional con el as? operador.

Eso nos deja con el código completo:

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 }