从任意到双swift的铸造

从任意到双swift的铸造,swift,dictionary,casting,Swift,Dictionary,Casting,我有一个简单的问题,我有这本字典: let dict: [String: Any] = ["Area": "100", "YessorNo" : true] 对于键区域,我想将其值转换为双精度,如下所示: let a = dict["Area"] as? Double 当我打印a时,我得到一个nil,为什么?值100虽然是一个字符串,但它是一个数字,不是吗?为什么我不能将其强制转换为双精度?您不能直接将字符串强制转换为双精度,您需要使用正确的初始值设定项 guard let numStr =

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

let dict: [String: Any] = ["Area": "100", "YessorNo" : true]
对于键
区域
,我想将其值转换为
双精度
,如下所示:

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

当我打印
a
时,我得到一个
nil
,为什么?值
100
虽然是一个
字符串
,但它是一个数字,不是吗?为什么我不能将其强制转换为
双精度

您不能直接将
字符串
强制转换为
双精度
,您需要使用正确的初始值设定项

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

您不能直接将
字符串
强制转换为
双精度
,您需要使用正确的初始值设定项

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

首先,从Any转换为String,然后使用初始值设定项将其转换为Double

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

首先,从Any转换为String,然后使用初始值设定项将其转换为Double

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


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

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

“但它是一个数字,不是吗?”–不是。它是一个字符串。@BrendonCheung您的字典类型是any,这意味着它可以存储任何类型的值。这不允许混合值类型。存储在Any中的字符串将始终转换为String only而不是Double或任何其他类“但它是一个数字不是?”–否。它是一个字符串。@BrendonCheung您的字典类型是Any,这意味着它可以存储任何类型的值。这不允许混合值类型。存储在Any中的字符串将始终转换为String only而不是Double或任何其他classesThank,因此不可能直接将
Any
AnyObject
转换为
Double
?为什么?强制转换只是告诉编译器关闭并将值作为特定类型处理的一种方式。它不会将该值转换为强制类型。如果键入的值(any)实际上包含一个double,则可以强制转换它。但如果它包含一个字符串,这将是不可能的,因为字符串和双精度是完全不同的东西。您只能强制转换相关的类型。您可以将
Any
强制转换为
String
,因为
String
Any
Double
)。但是
字符串
不是
双精度
。谢谢,因此不可能直接将
任何
任何对象
转换为
双精度
?为什么?强制转换只是告诉编译器关闭并将值作为特定类型处理的一种方式。它不会将该值转换为强制类型。如果键入的值(any)实际上包含一个double,则可以强制转换它。但如果它包含一个字符串,这将是不可能的,因为字符串和双精度是完全不同的东西。您只能强制转换相关的类型。您可以将
Any
强制转换为
String
,因为
String
Any
Double
)。但是
字符串
不是
双精度
。感谢您的洞察力!但是我以前见过程序员将
AnyObject
转换成
Double
这样:在
map
函数下,他们有一个
[String:AnyObject]
类型的字典,直接将
AnyObject
转换成
Double
是的,如果底层类型是Double,任何对象都可以转换成Double。在你发布的代码中。是,数据[“时间”]为?Double可以工作,但底层字典必须如下所示[“time”:25.0]。它不能像这样[“time”:“25”]。好吧,明白了,但根据苹果公司的说法:Any可以表示任何类型的实例,包括函数类型。任何对象都可以表示任何类类型的实例。为什么可以将任何对象强制转换为结构?as运算符执行类型强制转换并检查协议性能。例如,我相信任何对象作为Struct都是协议一致性检查,但我有兴趣进一步检查它。谢谢你的洞察力!但是我以前见过程序员将
AnyObject
转换成
Double
这样:在
map
函数下,他们有一个
[String:AnyObject]
类型的字典,直接将
AnyObject
转换成
Double
是的,如果底层类型是Double,任何对象都可以转换成Double。在你发布的代码中。是,数据[“时间”]为?Double可以工作,但底层字典必须如下所示[“time”:25.0]。它不能像这样[“time”:“25”]。好吧,明白了,但根据苹果公司的说法:Any可以表示任何类型的实例,包括函数类型。任何对象都可以表示任何类类型的实例。为什么可以将任何对象强制转换为结构?as运算符执行类型强制转换并检查协议性能。例如,我相信任何对象作为Struct都是协议一致性检查,但我有兴趣进一步检查它。