NSNumber 与 Int,在 Swift 字典中浮动

NSNumber vs Int, Float in Swift Dictionary

根据 Swift 3 文档,NSNumber 桥接到 Swift 本机类型,例如 Int、Float、Double...但是当我尝试在 Dictionary 中使用本机类型时,我得到了编译使用 NSNumber 时得到修复的错误,这是为什么?这是我的代码:

var dictionary:[String : AnyObject] = [:]
dictionary["key"] = Float(1000)

并且编译器给出错误 "Can not assign value of type Float to AnyObject"。如果我这样写代码,就没有问题,因为 NSNumber 实际上是一个对象类型。

dictionary["key"] = NSNumber(value:Float(1000))

Swift编译器也提示更正代码为

dictionary["key"] = Float(1000) as AnyObject

但我不确定这样做是否正确。如果 NSNumber 和本机类型(Int、Float 等)之间确实存在桥接,为什么编译器强制类型转换为 AnyObject?

FloatIntDouble 等原始类型被定义为 struct,因此它们不实现 AnyObject 协议。相反,Any 可以代表任何类型的实例,所以你的字典的类型应该是:

var dictionary: [String: Any] = [:]

除此之外,在您的代码中:

dictionary["key"] = Float(1000) as AnyObject

Float 隐式转换为 NSNumber,然后向上转换为 AnyObject。您可以直接 as NSNumber 来避免后者。

import Foundation

var dictionary:[String : NSNumber] = [:]
dictionary["key1"] = 1000.0
dictionary["key2"] = 100

let i = 1
let d = 1.0

dictionary["key3"] = i as NSNumber
dictionary["key4"] = d as NSNumber

如果你真的想要 AnyObject 作为一个值

import Foundation

var dictionary:[String : AnyObject] = [:]

dictionary["key1"] = 1000.0 as NSNumber
dictionary["key2"] = 100 as NSNumber

let i = 1
let d = 1.0

dictionary["key3"] = i as NSNumber
dictionary["key4"] = d as NSNumber