var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: error) as NSDictionary;
Cette ligne de code me donne une erreur
NSError is not convertable to NSErrorPointer.
J'ai donc pensé à changer le code en:
var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary;
qui transformerait l'erreur NSError en NSErrorPointer. Mais alors je reçois une nouvelle erreur et je ne peux pas la comprendre:
NSError! is not a subtype of '@|value ST4'
Ces types et méthodes ont beaucoup changé depuis Swift 1.
NS
est suppriméIl en résulte le code suivant:
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)")
}
De, si vous ne vous souciez pas de l'erreur d'analyse spécifique:
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")
}
Réponse originale
Votre NSError doit être définie comme un Optional
car elle peut être nulle:
var error: NSError?
Vous devez également tenir compte d'une erreur dans l'analyse qui renverra nil
ou l'analyse renvoyant un tableau. Pour ce faire, nous pouvons utiliser un casting optionnel avec le as?
opérateur.
Cela nous laisse avec le code complet:
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
}
Comme mentionné, l'erreur doit être définie comme facultative ( https://developer.Apple.com/library/prerelease/ios/documentation/Swift/conceptual/buildingcocoaapps/AdoptingCocoaDesignPatterns.html )
Cependant - Ce code CRASH s'il y a une erreur et si rien est retourné, le "As NSDictionary" serait le coupable:
var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary;
Vous devez effectuer l'analyse json comme ceci:
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)")
}
Ça marchera. Souvenez-vous également que json peut revenir sous forme de tableau. Au lieu de passer à zéro pour les options, vous pouvez passer ce que vous voulez, par exemple:
NSJSONReadingOptions.AllowFragments
si tu veux.
Maintenant en beta-3
var error: AutoreleasingUnsafePointer<NSError?> = nil
var data: NSDictionary = NSJSONSerialization.JSONObjectWithData( w, options:.AllowFragments, error: error ) as NSDictionary;
Vérifiez avec le code ci-dessous:
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)")
Essayez d'utiliser
var error: AutoreleasingUnsafePointer<NSErrorPointer?>=nil