Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Can';t将UInt64添加到类型为:[String:AnyObject?]的字典中_Swift_Nsdictionary_Swift2.3 - Fatal编程技术网

Swift Can';t将UInt64添加到类型为:[String:AnyObject?]的字典中

Swift Can';t将UInt64添加到类型为:[String:AnyObject?]的字典中,swift,nsdictionary,swift2.3,Swift,Nsdictionary,Swift2.3,我正在努力制作一本这样的词典: func someFunc() -> [String : AnyObject?] { var dic = [ "Name": someString_Variable, "Sum": someUInt64_Variable ] 问题是当我添加someUInt64\u变量时,我得到错误: Cannot convert value of type UInt64 to expected dic

我正在努力制作一本这样的词典:

func someFunc() -> [String : AnyObject?] {
    var dic = [
            "Name": someString_Variable,
            "Sum": someUInt64_Variable
        ]
问题是当我添加
someUInt64\u变量时,我得到错误:

Cannot convert value of type UInt64 to expected dictionary value type Optional<AnyObject>
无法将UInt64类型的值转换为预期的字典值类型(可选)
在这里要做什么,我必须使用
UInt64
我无法将其转换为
String


为什么我会得到这个错误?

< P>这是在SWIFT类型被自动桥接到基础类型时使用的SWIFT的早期版本。现在该功能已被删除,您必须明确地执行此操作:

您只需将它们显式地强制转换为
任何对象

let dic : [String: AnyObject?] = [
    "Name": someString_Variable as AnyObject,
    "Sum":  someUInt64_Variable as AnyObject
]
和SWIFT会将它们转换为基础类型<代码> NString <代码>字符串和<代码> NStudio<代码> > <代码> UTIN 64 < /代码> ./P> 如果您自己直接转换到这些类型,可能会更清楚:

let dic : [String: AnyObject?] = [
    "Name": someString_Variable as NSString,
    "Sum":  someUInt64_Variable as NSNumber
]

了解这里发生的事情很重要:
Int64
AnyObject
不兼容,因为它只是一个对象

通过桥接基础类型,如<代码> SOMUUTIN 64变量,作为NStOuts,在对象中包装<代码>将分配一个新的
NSNumber
对象,并在其中存储您的
Int64

也许您确实需要
AnyObject
,但在这种情况下,通常您会使用
Any

func someFunc() -> [String : Any] {
    var dic = [
            "Name": someString_Variable,
            "Sum": someUInt64_Variable
        ]

这提供了更好的性能(没有额外的堆分配),并且您不依赖于基础桥接

如果你的字典只是用来将一组有限的已知键映射到值,那么几乎可以肯定的是,你应该创建一个model
struct
来表示该数据。一如既往,可选的字典值是没有意义的,因为根据定义,nil值表示缺少键。对不起,我仍然不明白该怎么做。我试图将类型更改为“[String:AnyObject]”,但仍然不起作用。请注意,这是因为现在任何类型的
Any
,和来自类的任何对象
AnyObject
,结构不是
AnyObject
s之间存在差异。由于
UInt64
是一个结构,因此必须显式地进行转换。有关更多信息,请参阅。事实上,OP首先使用
Any
可能会更好。@BallpointBen,这一直是
Any
AnyObject
之间的区别。Swift团队刚刚删除了<代码>字符串 s和<代码> int >代码> s到基础类型的自动转换。如果您计划将此词典发送到采用
NSDictionary
的Cocoa Touch框架,则
[String:Any]
不会将其删除。哦,我没有意识到这一点。谢谢。@BallpointBen,更正我先前的陈述。在OP询问的Swift 2.3中,您不能强制
[String:Any]
NSDictionary
。但是,在Swift 3中,这确实有效。啊,斯威夫特的流沙。。。