【问题标题】:Can't add UInt64 to dictionary of type: [String : AnyObject?]无法将 UInt64 添加到类型字典中:[String : AnyObject?]
【发布时间】:2017-01-06 13:39:53
【问题描述】:

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

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

【问题讨论】:

  • 如果您的字典仅用于将一组有限的已知键映射到值 - 您几乎肯定应该创建一个模型 struct 来表示该数据。
  • 与往常一样,可选的字典值是无意义的,因为根据定义,nil 值表示缺少键。
  • 对不起,我还是不明白我应该怎么做。我试图将类型更改为 '[String : AnyObject]' 但它仍然不起作用。

标签: swift nsdictionary swift2.3


【解决方案1】:

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

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

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

Swift 会将它们转换为 Foundation 类型,NSString 对应 StringNSNumber 对应 UInt64

如果您自己转换为这些类型可能会更清楚:

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

【讨论】:

  • 为了记录,这是因为Any 是任何类型,AnyObject 是来自一个类的任何对象——结构不是 @987654331 @s。由于UInt64 是一个结构,因此必须进行显式转换。有关更多信息,请参阅here。事实上,首先使用Any 可能会更好。
  • @BallpointBen,这始终AnyAnyObject 之间的区别。 Swift 团队刚刚删除了 Strings 和 Ints 到 Foundation 类型的自动转换。如果您打算将此字典发送到采用NSDictionaryCocoa Touch 框架,那么[String: Any] 不会削减它。
  • 哦,没意识到。谢谢。
  • @BallpointBen,更正我之前的声明。在 OP 询问的 Swift 2.3 中,您不能将 [String: Any] 强制转换为 NSDictionary。但是,在 Swift 3 中,这确实有效。啊,斯威夫特不断变化的沙子……
【解决方案2】:

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

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

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

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

这提供了更好的性能(无需额外的堆分配)并且您不依赖于 Foundation 桥接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多