2017-04-23 13 views
8

Zgodnie z dokumentacją Swift 3, NSNumber jest zmostkowany do rodzimych typów Swift, takich jak Int, Float, Double, ... Ale kiedy próbuję używać natywnego typu w Słowniku, dostaję błędy kompilacji zostać naprawione przy użyciu NSNumber, dlaczego tak jest? Oto mój kod:NSNumber vs Int, Float w Swift Dictionary

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

, a kompilator podaje błąd "Nie można przypisać wartości typu Float do AnyObject". Jeśli napiszę kod w następujący sposób, nie ma problemów, ponieważ NSNumber jest w rzeczywistości typem obiektu.

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

Swift kompilator skłania również do skorygowania kodu jako

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

ale nie jestem pewien, czy to jest poprawne rzeczą do zrobienia, czy nie. Jeśli rzeczywiście istnieje pomost między NSNumber a rodzimymi typami (Int, Float itp.), Dlaczego kompilator wymusza typografię AnyObject?

+0

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

Odpowiedz

6

typie pierwotnym jak Float, Int, Double są zdefiniowane jako struct więc nie wdrożyć protokół AnyObject. Zamiast Any może oznaczać wystąpienie dowolnego typu w ogóle więc rodzaj słownika powinny być:

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

Oprócz tego w kodzie kiedy to zrobić:

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

Float zostanie przekonwertowany do NSNumber dorozumiany a następnie jest upcasted do AnyObject. Mogłeś właśnie zrobić as NSNumber, aby uniknąć tego drugiego.

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 

jeśli naprawdę chciałby AnyObject jako wartość

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