【问题标题】:Casting from Any to Double swift从 Any 转换为 Double swift
【发布时间】:2017-09-28 13:11:42
【问题描述】:

我有一个简单的问题,我有这本词典:

let dict: [String: Any] = ["Area": "100", "YessorNo" : true]

而且,对于键 area,我想将其值转换为 double,如下所示:

let a = dict["Area"] as? Double

当我打印a 时,我得到一个nil,为什么? 100 的值虽然是 string,但它不是一个数字吗?为什么我不能将其转换为 double

【问题讨论】:

  • "但它不是一个数字吗?" – 不,它是一个字符串。
  • @BrendonCheung 您的字典类型是任何类型,这意味着它可以存储任何类型的值。这不允许混淆值类型。存储在 Any 中的字符串将始终转换为字符串,而不是 Double 或任何其他类

标签: swift dictionary casting


【解决方案1】:

您不能直接将String 转换为Double,您需要使用正确的初始化程序。

guard let numStr = dict["Area"] as? String else {
    return
}
let a = Double(numStr)

【讨论】:

  • 谢谢,所以不可能直接将AnyAnyObject 转换为double?这是为什么呢?
  • 强制转换只是告诉编译器关闭并将值视为某种类型的一种方式。它不会将该值转换为强制类型。如果键入 any 的值实际上包含双精度值,则可以强制转换它。但如果它包含一个字符串,那将是不可能的,因为字符串和双精度是非常不同的东西。
  • 您只能转换相关的类型。您可以将Any 转换为String,因为StringAnyDouble 也是如此)。但是String 不是Double
【解决方案2】:

首先,从 Any 转换为 String,然后使用初始化器将其转换为 Double。

if let a = dict["Area"] as? String, let aDouble = Double(a) {
    print(aDouble)
}

【讨论】:

    【解决方案3】:

    由于其他答案提供了代码,我将重点介绍问题的原因。类型转换不起作用,因为根据 Swift 文档,类型转换允许您“将该实例视为与其类层次结构中其他位置不同的超类或子类”。由于 double 不是字符串的子类或超类,因此即使该字符串是数字字符串,也不能将字符串强制转换为 double。这就是为什么尝试将字符串转换为 double 返回 nil 的原因。

    【讨论】:

    • 感谢您的洞察力!但我之前见过AnyObjectDouble 的编码员,像这样:github.com/carambalabs/DarkSkyKit/blob/master/DarkSkyKit/Models/…
    • map 函数下,他们有一个[String: AnyObject] 类型的字典,并直接将AnyObject 转换为Double
    • 是的,如果基础类型是 Double,AnyObject 可以转换为 Double。在您发布的代码中。是的,data["time"] 作为? Double 有效,但底层字典必须如下所示 ["time" : 25.0 ]。它不能像这样 ["time" : "25"]。
    • 好的,明白了,但根据 Apple 的说法:Any 可以表示任何类型的实例,包括函数类型。 AnyObject 可以表示任何类类型的实例。为什么将 AnyObject 转换为结构是可能的?
    • as 运算符执行类型转换并检查协议性能。因此,我相信 AnyObject as Struct 将是一个协议一致性检查,但我有兴趣进一步检查它。 developer.apple.com/library/content/documentation/Swift/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多