0

这就是我试图用字典做的事情:

    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)。

4

3 回答 3

0

正如我在评论中指出的那样,这不是铸造。你想要一个数据转换。您需要明确地这样做,尤其是在这种情况下,因为它可能会失败。

查看错误,我认为您确实有一本[String:String]此处的字典(NSDictionary形式)。这表明 JSON 编码错误,但这就是生活。假设dictionary看起来像这样:

let dictionary: NSDictionary = ["deliveries": ["2":"0", "5": "2.59", "7": "3.59"]]

你可以把它转换成[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
}

这会默默地忽略任何无法转换为 Double 的值。如果您宁愿生成错误,请使用 aguard let而不是if let.

于 2016-02-08T13:58:49.187 回答
0

您正在尝试直接转换字典,但您需要转换每个键值对。如果您想要解决此问题的通用解决方案,请查看SwiftyJSON库,它为您解决 JSON 解析问题。

于 2016-02-08T13:03:09.070 回答
0

强制转换并不意味着从一种类型到另一种类型的数据转换。
您的字典似乎由Integer键和String值组成。
如果您想转换其他内容,可以使用 map 功能。

let converted = deliveries.map{[Double($0) : Double($1)]}

但要注意。
在这里我们说,遍历字典(在 $0 中有字典键,在 $1 中有值)并创建一个新字典,该字典具有在键值Double处初始化的键和作为新值的Double初始化为旧字典值。最后一次转换可能会失败,因此返回的数据是可选的。

于 2016-02-08T13:19:16.720 回答