【问题标题】:Storing a dictionary of Int and Array in NSUserDefaults error在 NSUserDefaults 错误中存储 Int 和 Array 的字典
【发布时间】:2015-11-22 16:21:33
【问题描述】:

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

我了解您只能将某些数据类型存储到 NSUserDefaults 中:

NSUserDefaults 类提供了方便的方法来访问常见类型,例如floatsdoublesintegersBooleansURLs。默认对象必须是一个属性列表,即以下实例(或集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。如果要存储任何其他类型的对象,通常应该将其归档以创建 NSData 的实例。

我知道我可以做到以下几点:

var cities = [String]()
cities = NSUserDefaults.standardUserDefaults().objectForKey("cities") as! NSArray

这是允许的,因为它将我的城市字符串数组转换为 NSArray 并且 NSUserDefaults 接受此数据类型。但是,我有一个 Int 和 Array 的字典,即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>> 之类的。

【问题讨论】:

  • 您不能以NSNumberInt 作为键存储字典

标签: ios arrays swift dictionary nsuserdefaults


【解决方案1】:

要将字典存储在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)
    }

【讨论】:

  • 非常感谢亚当的回复!
  • 一个问题:我认为您提供的代码就像 NSUserDefaults 的“设置”。我将如何继续实际将数据放入我的字典中?
  • 此行创建示例数据:addressDict[3] = ["string1", "string2"]
  • 这是一个愚蠢的问题。对此感到抱歉。
  • 我尝试了您提供的代码,但它似乎没有永久存储数据。当我执行addressDict2 时,它会打印正确的数据。但是在我退出我的应用程序后,数据似乎并没有保留在 userdefaults 中......我可能做错了什么。知道那可能是什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多