无法将 UInt64 添加到类型的字典中:[String : AnyObject?]

Can't add UInt64 to dictionary of type: [String : AnyObject?]

我正在尝试制作这样的字典:

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
为什么我还是会收到此错误?

这曾经在 Swift 的早期版本中起作用,当时 Swift 类型自动桥接到 Foundation 类型。现在该功能已被删除,您必须明确地执行此操作:

您可以直接将它们显式转换为 AnyObject:

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

和 Swift 会将它们转换为 Foundation 类型 NSString for StringNSNumber for UInt64 .

如果你自己转换成那些类型可能会更清楚:

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

了解这里真正发生的事情很重要:Int64AnyObject 不兼容,因为它根本不是一个对象。

通过桥接到 Foundation 类型,例如 someUInt64_Variable as NSNumber,您可以将 Int64 包装在一个对象中。分配了一个新的 NSNumber 对象,您的 Int64 存储在其中。

也许你真的需要 AnyObject,但在这种情况下通常你会使用 Any

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

这提供了更好的性能(没有额外的堆分配)并且您不依赖于 Foundation-bridging。