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

时间:2017-01-06 13:39:53

标签: swift nsdictionary swift2.3

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

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

2 个答案:

答案 0 :(得分:1)

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

您可以将它们明确地转换为AnyObject

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

并且Swift会将它们转换为NSString基础类型StringNSNumber的{​​{1}}。

如果您自己投射到这些类型可能会更清楚:

UInt64

答案 1 :(得分:0)

了解这里发生的事情非常重要:Int64AnyObject不兼容,因为它根本不是对象。

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

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

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

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