这就是我想用字典做的事情:
if let deliveries = dictionary["deliveries"] as? NSDictionary {
var castedDeliveries = [Double: Double]()
for delivery in deliveries {
if let value = delivery.value as? Double {
castedDeliveries[Double(delivery.key as! NSNumber)] = value //Could not cast value of type 'NSTaggedPointerString' (0x1a1e3af20) to 'NSNumber' (0x1a1e458b0).
}
}
settings!.deliveries = castedDeliveries
}
这是我尝试投射的内容,作为来自服务器的JSON响应的一部分:
deliveries = {
2 = 0;
5 = "2.59";
7 = "3.59";
};
它不起作用,因为注释行有错误:
无法将'NSTaggedPointerString'(0x1a1e3af20)类型的值转换为'NSNumber'(0x1a1e458b0)。
答案 0 :(得分:0)
您正在尝试直接投射字典,而是需要投射每个键 - 值对。如果您想要解决此问题的通用解决方案,请查看documentation库,它可以解决JSON解析问题。
答案 1 :(得分:0)
转换并不意味着从一种类型到另一种类型的数据转换
您的词典似乎由Integer
键和String
值组成
如果你想转换其他东西你可以使用map函数。
let converted = deliveries.map{[Double($0) : Double($1)]}
但请注意
在这里我们说,迭代字典(在$ 0中,$ 1中存在值的字典键)并创建一个新的字典,其中键{a} Double
初始化为键值,并作为新值Double
初始化为旧字典值。最后一次转换可能会失败,因此返回的数据是可选的。
答案 2 :(得分:0)
正如我在评论中所指出的,这不是铸造。您想要数据转换。您需要明确地这样做,特别是在这种情况下,因为它可能会失败。
看一下这个错误,我觉得你这里有一个val route = HttpService.apply({
case GET -> Root / "hello" =>
Ok("Hello world.")
})
的字典([String:String]
形式)。这表明JSON编码错误,但这就是生活。假设NSDictionary
看起来像这样:
dictionary
您可以将其转换为let dictionary: NSDictionary = ["deliveries": ["2":"0", "5": "2.59", "7": "3.59"]]
,如下所示:
[Double:Double]
这会默默地忽略任何无法转换为Double的值。如果您希望生成错误,请使用if let jsonDeliveries = dictionary["deliveries"] as? [String:String] {
var deliveries: [Double: Double] = [:]
for (key, value) in jsonDeliveries {
if let keyDouble = Double(key),
valueDouble = Double(value) {
deliveries[keyDouble] = valueDouble
}
}
// Use deliveries
}
而不是guard let
。