I have a Swift struct like this.
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
}
}
From an API, I get the following JSON response. This is the println of the jsonDict
variable.
[
"totalfup": 96.340899,
"totalrem": 3548710948
]
When I try to assign the value of the totalfup
to the property totalData
, I get this error.
Could not cast value of type 'NSTaggedPointerString' to 'NSNumber'
Anyone knows why? I tried changing the property type to float
and then the whole struct to class but still the issue occurs.
Swift 4
Update
The reason of the error is
jsonDict["totalfup"]
is a String (NSTaggedPointerString
is a subclass ofNSString
) , so you should convert String to Double.Please make sure, catch exception and check type before force-unwrap !
For safety, using
if let
:I think this could help you
The failure reason is that the JSON returns
String
values, not numbers.If the returned JSON data contains only these two key value pairs declare the type as
[String:String]
that avoids the type casting.In any case you have to put the code to update the variables into the "good" branch of the
do - catch
expression.why not use Swift's native types directly?