如何将Swift中的Dictionary转换为相关类型?

时间:2016-02-08 12:56:14

标签: ios swift swift-dictionary

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

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

3 个答案:

答案 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