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
}