无法将 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 String
和 NSNumber
for UInt64
.
如果你自己转换成那些类型可能会更清楚:
let dic : [String: AnyObject?] = [
"Name": someString_Variable as NSString,
"Sum": someUInt64_Variable as NSNumber
]
了解这里真正发生的事情很重要:Int64
与 AnyObject
不兼容,因为它根本不是一个对象。
通过桥接到 Foundation 类型,例如 someUInt64_Variable as NSNumber
,您可以将 Int64
包装在一个对象中。分配了一个新的 NSNumber
对象,您的 Int64
存储在其中。
也许你真的需要 AnyObject
,但在这种情况下通常你会使用 Any
:
func someFunc() -> [String : Any] {
var dic = [
"Name": someString_Variable,
"Sum": someUInt64_Variable
]
这提供了更好的性能(没有额外的堆分配)并且您不依赖于 Foundation-bridging。
我正在尝试制作这样的字典:
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 String
和 NSNumber
for UInt64
.
如果你自己转换成那些类型可能会更清楚:
let dic : [String: AnyObject?] = [
"Name": someString_Variable as NSString,
"Sum": someUInt64_Variable as NSNumber
]
了解这里真正发生的事情很重要:Int64
与 AnyObject
不兼容,因为它根本不是一个对象。
通过桥接到 Foundation 类型,例如 someUInt64_Variable as NSNumber
,您可以将 Int64
包装在一个对象中。分配了一个新的 NSNumber
对象,您的 Int64
存储在其中。
也许你真的需要 AnyObject
,但在这种情况下通常你会使用 Any
:
func someFunc() -> [String : Any] {
var dic = [
"Name": someString_Variable,
"Sum": someUInt64_Variable
]
这提供了更好的性能(没有额外的堆分配)并且您不依赖于 Foundation-bridging。