2017-04-23 17 views
8

Swift 3 belgelerine göre, NSNumber, Int, Float, Double gibi Swift yerel türlerine köprüler ... Ancak, Sözlük'te yerel bir tür kullanmayı denediğimde derleme hataları alıyorum NSNumber kullanarak sabit olsun, neden bu? İşte benim kodudur:NSNumber vs Int, Swift Dictionary'de Float

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

ve derleyici "AnyObject tip Float değerini atanamıyor" hatası vermeye başladı. Kodu aşağıdaki gibi yazarsam, NSNumber aslında bir nesne türü olduğu için sorun yoktur.

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

Swift derleyici da

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

olarak kod düzeltmek ister ama bunu yapmak ya da değil doğru şey olup olmadığından emin değilim. Gerçekten de NSNumber ile yerel türler (Int, Float, vb.) Arasında bir köprüleme var ise, derleyici neden AnyObject’e tiplendirmeyi zorluyor?

+0

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

cevap

6

İlkel türleri Float gibi Int, Double yüzden AnyObject protokolünü uygulamak gerekmez struct olarak tanımlanmaktadır. Bunun yerine, Any hiç bu kadar sözlüğünüzün tip olmalıdır türlü bir örneğini temsil edebilir:

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

Bunun dışında kodunuzda bunu yaptığında:

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

Float örtülü NSNumber dönüştürülür alır ve sonra AnyObject için yayınlanmıştır. Bunu önlemek için sadece as NSNumber yapmış olabilirsiniz.

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 

Eğer gerçekten bir değer olarak AnyObject isterseniz

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