2016-06-13 48 views
-1

我想在NSUserDefaults中存儲通用數組,但出現以下錯誤:Cannot convert value of type 'Array<T>' to expected argument type 'AnyObject?'將通用數組存儲在NSUserDefaults中

我該如何解決這個問題?

public class PropertyStore { 
    private let userDefaults = NSUserDefaults.standardUserDefaults() 

    public func loadSet<T>(key: String) -> Set<T>? { 
     guard let array = userDefaults.objectForKey(key) as? [T] else { 
      return nil 
     } 

     return Set<T>(array) 
    } 

    public func saveSet<T>(key: String, value: Set<T>) { 
     let array = Array(value) 
     userDefaults.setObject(array, forKey: key) // <- ERROR 
    } 
} 

回答

0

您應該將T定義爲NSCoding符合類。所以當你要存儲數組時,你將要存儲一個NSKeyedArchiver.archiveDataWithRootObject()結果數組。然後,在loadSet方法返回一個Set<T>,你應該unarchive所有對象:

let storedData = NSUserDefaults.standardUserDefaults. ... 
return storedData.flatMap { return NSKeyedUnarchiver.unarchiveObjectWithData($0) } 
+0

但是,如果我有一個'設置'這不會是例如'設置'兼容。 – multiholle

+0

因此,嘗試接受每個「T」並嘗試檢查方法中的「T」類型 –

1

像@lucasD說,T需要順應NSCoding ATLEAST。所以代碼看起來像這樣。

 public func saveSet<T: NSCoding>(key: String, value: Set<T>) { 
     let array = Array(value) 
     userDefaults.setObject(array, forKey: key) 
    } 

然而,這不會有很多原因一樣工作:

public func loadSet<T: NSCoding>(key: String) -> Set<T>? { 
    guard let array = userDefaults.objectForKey(key) as? [T] else { 
     return nil 
    } 

    return Set<T>(array) 
    } 

    let defaults = PropertyStore() 
    defaults.saveSet("array", value: [1,2,3]) 
    ///defaults.loadSet<Int>("array") ===> Cannot explicitly specialize a function 
    ///defaults.loadSet("array")  ===> Cannot infer Type T 
    //let a: Set<Int>? = defaults.loadSet("array") ==> T cannot be inferred 

loadSet類型T的情況下,不能正確地推斷,因爲我們不能從外部指定它,據我所知。我會首先嚐試返回NSObject或Set<AnyObject> or Set<NSCoding>,然後鍵入明確。讓我知道如果這是更好的方式。

你可以看看這個SO帖子,以獲得更多關於泛型參數爲什麼不能從外部專門化的更多信息。 SO Generics specialization

相關問題