web-dev-qa-db-fra.com

Impossible de convertir la valeur de type 'NSTaggedPointerString' en 'NSNumber'

J'ai un struct Swift comme ceci.

struct Usage {
    var totalData: Double
    var remainingTotalData: Double

    init(jsonData: NSData) {
        var jsonDict = [String: AnyObject]()

        do {
            jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! [String: AnyObject]
        } catch {
            print("Error occurred parsing data: \(error)")
        }

        totalData = jsonDict["totalfup"] as! Double
        remainingTotalData = jsonDict["totalrem"] as! Double
    }
}

À partir d'une API, j'obtiens la réponse JSON suivante. C'est le println de la variable jsonDict.

[
    "totalfup": 96.340899, 
    "totalrem": 3548710948
]

Lorsque j'essaie d'assigner la valeur de totalfup à la propriété totalData, j'obtiens cette erreur.

Impossible de convertir la valeur du type "NSTaggedPointerString" en "NSNumber"

Quelqu'un sait pourquoi? J'ai essayé de changer le type de propriété en float, puis toute la structure en classe, mais le problème persiste.

67
Isuru

La raison de l'erreur est jsonDict["totalfup"] est une chaîne (NSTaggedPointerString est une sous-classe de NSString), vous devez donc convertir String en double.

S'il vous plaît assurez-vous, attraper une exception et vérifier le type avant de forcer dérouler!

totalData = (jsonDict["totalfup"] as! NSString).doubleValue

Pour la sécurité, utilisez if let:

if let totalfup = (dict["totalfup"] as? NSString)?.doubleValue {
  // here, totalfup is a Double
}
else {
  // dict["totalfup"] isn't a String
}
98
tuledev

Je pense que cela pourrait vous aider

totalData = Double(jsonDict["totalfup"] as! String)!
16
Hwei

La raison de l'échec est que le JSON renvoie String des valeurs et non des nombres.

Si les données JSON renvoyées contiennent uniquement ces deux paires de valeurs de clé, déclarez le type sous la forme [String:String] qui évite le transtypage.

Dans tous les cas, vous devez mettre le code pour mettre à jour les variables dans la "bonne" branche du do - catch expression.

struct Usage {
    var totalData = 0.0
    var remainingTotalData = 0.0

    init(jsonData: NSData) { // Swift 3: Data

        do {
            let jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! [String: String]                
            // Swift 3: let jsonDict = try NSJSONSerialization.jsonObject(with: jsonData) as! [String: String]
            totalData = Double(jsonDict["totalfup"]!)
            remainingTotalData = Double(jsonDict["totalrem"]!)
        } catch {
            print("Error occurred parsing data: \(error)")
        }
    }
}
4
vadian