2017-04-23 7 views
8

Swift 3のドキュメントによると、NSNumberはInt、Float、DoubleなどのSwiftネイティブタイプにブリッジされています。しかし、辞書でネイティブタイプを使用しようとすると、 NSNumberを使用すると固定されますが、それはなぜですか?ここに私のコードです:NSNumberとInt、Swift DictionaryのFloat

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

とコンパイラが「ANYOBJECTにfloat型の値を割り当てることができません」エラーが発生します。コードを次のように記述すると、NSNumberが実際にオブジェクト型であるため問題はありません。

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

スウィフトコンパイラも

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

ように、コードを修正するよう要求しますが、私は何かないように正しいものであるかどうかわからないです。実際にNSNumberとネイティブ型(Int、Floatなど)の間にブリッジがある場合、コンパイラはAnyObjectに型キャストする必要がありますか? FloatIntDoubleよう

+0

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

答えて

6

プリミティブ型は、そう、彼らはAnyObjectプロトコルを実装していないstructとして定義されています。

それとは別に
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 
関連する問題