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
]
这提供了更好的性能(没有额外的堆分配),并且您不依赖于基础桥接 如果你的字典只是用来将一组有限的已知键映射到值,那么几乎可以肯定的是,你应该创建一个modelstruct
来表示该数据。一如既往,可选的字典值是没有意义的,因为根据定义,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中,这确实有效。啊,斯威夫特的流沙。。。