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.
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
}
Je pense que cela pourrait vous aider
totalData = Double(jsonDict["totalfup"] as! String)!
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)")
}
}
}