2017-04-23 113 views
8

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

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

并且编译器给出错误“无法将Float类型的值赋值给AnyObject”。如果我按照以下方式编写代码,则不存在任何问题,因为NSNumber实际上是一种对象类型。

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

斯威夫特编译器还提示纠正代码

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

,但我不知道这是否是做或不正确的事情。如果确实在NSNumber和本地类型(Int,Float等)之间存在桥接,那么为什么编译器强制将类型转换为AnyObject?

+0

相关:http://stackoverflow.com/questions/39321421/working-with-nsnumber-integer-values-in-swift- 3 –

回答

6

原始类型等FloatIntDouble被定义为struct所以它们不执行AnyObject协议。从除了

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

,在你的代码,当你做:相反,Any可以代表任何类型的实例在所有所以你的字典的类型应该是

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

Float被转换为NSNumber隐然后上传到AnyObject。你可以刚完成as NSNumber以避免后者。

1
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