在NSUserDefaults中存储Int和Array的字典错误

时间:2015-08-28 05:11:15

标签: ios arrays swift dictionary nsuserdefaults

到目前为止我对这个主题的了解:

据我所知,只有某些数据类型可以存储到NSUserDefaults中:

  

NSUserDefaults类提供了访问常见类型的便捷方法,例如floatsdoublesintegersBooleansURLs。默认对象必须是属性列表,即(或集合的实例组合)的实例: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<String>>()。我知道NSUserDefaults接受NSDictionary,NSInteger和NSArray。

我想知道怎么做:

我想正确地投射addressDict,以便NSUserDefaults接受我的addressDict。虽然,我知道Dictionary,Array和Int可以作为单独的实体投入到它的NS对应物中,但我不知道如何完全将其作为数据类型Dictionary<Int, Array<String>>()。有帮助吗?例如,我知道这是完全错误的,但像NSDictionary<NSInteger, NSArray<String>>之类的东西。

1 个答案:

答案 0 :(得分:2)

要在NSUserDefaults中存储字典,您需要先将其转换为NSDataNSKeyedArchiverNSKeyedUnarchiver非常适合这项工作。以下示例显示如何在NSUserDefaults中存储字典并将其读回。

    var addressDict = Dictionary<Int, Array<String>>()
    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)
    }