我正在尝试制作这样的字典:
func someFunc() -> [String : AnyObject?] {
var dic = [
"Name": someString_Variable,
"Sum": someUInt64_Variable
]
问题是当我添加someUInt64_Variable
时出现错误:
Cannot convert value of type UInt64 to expected dictionary value type Optional<AnyObject>
该怎么做,我必须使用UInt64
我无法将其转换为String
。
为什么我还是会收到这个错误?
答案 0 :(得分:1)
当Swift类型自动桥接到 Foundation 类型时,这曾经在Swift的早期版本中工作。现在该功能已被删除,您必须明确地执行此操作:
您可以将它们明确地转换为AnyObject
:
let dic : [String: AnyObject?] = [
"Name": someString_Variable as AnyObject,
"Sum": someUInt64_Variable as AnyObject
]
并且Swift会将它们转换为NSString
的基础类型String
和NSNumber
的{{1}}。
如果您自己投射到这些类型可能会更清楚:
UInt64
答案 1 :(得分:0)
了解这里发生的事情非常重要:Int64
与AnyObject
不兼容,因为它根本不是对象。
通过桥接到基础类型,例如someUInt64_Variable as NSNumber
,您可以将Int64
包装在一个对象中。分配了一个新的NSNumber
对象,并将Int64
存储在其中。
也许您确实需要AnyObject
,但通常在这种情况下您会使用Any
:
func someFunc() -> [String : Any] {
var dic = [
"Name": someString_Variable,
"Sum": someUInt64_Variable
]
这提供了更好的性能(没有额外的堆分配),并且您不依赖于Foundation-bridge。