web-dev-qa-db-fra.com

swift programmation erreur NSErrorPointer etc

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'
42
user3732493

Ces types et méthodes ont beaucoup changé depuis Swift 1.

  1. Le préfixe NS est supprimé
  2. Les méthodes lèvent maintenant des exceptions au lieu de prendre un pointeur d'erreur
  3. L'utilisation de NSDictionary est déconseillée. Utilisez plutôt un dictionnaire Swift

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
}
68
drewag

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.

11
user1687195

Maintenant en beta-3

var error: AutoreleasingUnsafePointer<NSError?> = nil

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

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
0
PREMKUMAR