2015-05-21 39 views
34

NSUserDefaults ile bir dizi kaydetmeye çalışıyorum ve sonra diziyi yükleyin, ancak "genel parametre için argüman çıkarılamaz" hatası alıyorum. Yanlış yaptığım bir şey var mı? Kimse çabucak bu sorunu yaşıyor gibi görünmüyor, bu yüzden hiçbir çözüm bulamıyorum. Özgün hata aldıbağımsız değişken çıkarılamıyor olabilir

IBAction func loadData(sender: AnyObject) { 
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array {   
     self.showDataLabel.text = defaults.objectForKey("testScoreSATArray") as Array 
    } 
} 

cevap

58

nedeni Swift, Array belirli türdeki değerleri tutan bir jenerik konteyner olmasıdır. Böylece tamsayıları tutan Array<Int> veya dizeleri tutan Array<String> olabilir. Ancak sadece bir Array'a sahip olamazsınız. Dizinin içerdiği şeyin türü, genel parametre ve Swift, bu türün ne olması gerektiğini anlayamadığı için şikayet ediyor. Bazen, bu türün etrafındaki kod bağlamından çıkarılabilir, ancak her zaman değil, bu durumda olduğu gibi.

Sen depoladığınız şey türünü vererek sorunu çözebilirsiniz: Array<Int> yazma yerine

IBAction func loadData(sender: AnyObject) { 
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> { 

      self.showDataLabel.text = toString(testCompositeArray) 
    } 
} 

, sen de sorunu çözebilir, [Int]

kısa formu yazabilirsiniz bulduğunuz gibi NSArray kullanarak. Array'dan farklı olarak, NSArray, Swift'e farklı bir yaklaşımı olan Objective-C'den kaynaklandığı için jenerikler kullanmaz. Bunun yerine, NSArray yalnızca bir tür şey içerir, AnyObject. Bu, herhangi bir sınıfın örneklerine işaret eden bir referanstır. Bununla birlikte, NSArray ve AnyObject'u kullanmanın büyük bir dezavantajı vardır; bu, içerdikleri bir değeri her kullandığınızda, değeri tamsayıya bir tamsayı veya bir dize gibi gerçek bir değere "dökmeniz" gerekir. Bu bir acı olabilir ve daha da kötüsü, bazen başka bir şeyiniz olduğunda bir tür şeyiniz olduğunu varsaydığınızda hatalara neden olabilir. Swift, genellikle bu tür hataları önlemek için türler hakkında daha spesifik olmanızı önerir.

+1

Büyük cevap, Generics kavramını kavradım ... Son olarak! – DogCoffee

İlgili konular