2017-04-23 115 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