在NSUserDefaults错误中存储Int和Array的字典
到目前为止我对这个问题的了解:
我知道只有某些数据类型可以存储到NSUserDefaults中:
NSUserDefaults类提供了访问常用类型(如
floats
,doubles
,integers
,Booleans
和URLs
便捷方法。 默认对象必须是属性列表,即(或集合的实例组合)的实例:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。 如果要存储任何其他类型的对象,通常应将其存档以创建NSData实例。
我知道我可以做到以下几点:
var cities = [String]() cities = NSUserDefaults.standardUserDefaults().objectForKey("cities") as! NSArray
这是允许的,因为它将我的城市String数组转换为NSArray,NSUserDefaults接受此数据类型。 但是,我有一个Int和一个数组的字典,即var addressDict = Dictionary<Int, Array>()
。 我知道NSUserDefaults接受NSDictionary,NSInteger和NSArray。
我想知道怎么做:
我想正确地转换我的addressDict
,以便NSUserDefaults接受我的addressDict。 虽然,我知道Dictionary,Array和Int可以作为单独的实体被转换为它的NS对应物,但我不知道如何完全像数据类型Dictionary<Int, Array>()
。 有帮助吗? 例如,我知道这是完全错误的,但像NSDictionary<NSInteger, NSArray>
东西。
要在NSUserDefaults
存储字典,您需要NSUserDefaults
它们转换为NSData
。 NSKeyedArchiver
和NSKeyedUnarchiver
非常适合这项工作。 以下示例显示如何在NSUserDefaults
存储字典并将其读回。
var addressDict = Dictionary>() addressDict[3] = ["string1", "string2"] //some example values let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(data, forKey: "address") //storing if let data2 = defaults.objectForKey("address") as? NSData { //reading let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2) //unarchiving print(addressDict2) }