【问题标题】:Save Dictionary into NSUserDefaults Swift将字典保存到 NSUserDefaults Swift
【发布时间】:2016-11-12 15:54:37
【问题描述】:

我有一个字典,我想将它保存到 NSUserDefaults(或其他东西,以便在我终止应用程序后可以访问我的变量),我找到了一个示例:

var saved = NSUserDefaults.standardUserDefaults()
let dict = ["Name": "Paul", "Country": "UK"]
saved.setObject(dict, forKey: "SavedDict")

但是当我用它来挖掘字典时,它不起作用。 (可能是因为我的字典有点不一样)

我的字典是这样制作的:

 var userDictionary = [Int : Event]()

 struct Event {
        var sensorName: String
        var sensorType: String
        var sensorSub: String

    }

我添加这样的元素:

userDictionary[value] = Event(sensorName: "first", sensorType: "Temp", sensorSub: "Third")

这是我尝试做的,以便我可以存储它。

saved.setObject(userDictionary, forKey: "valueDictionary")

我得到这个错误:

无法将“[Int : SensorsView.Event]”类型的值转换为预期值 参数类型'AnyObject?'

为了避免这个错误,我这样做了:

self.saved.setObject(self.userDictionary as? AnyObject, forKey: "valueDictionary")

但我无法检索我保存的内容

不幸的是,这个question 在一些 cmets 之后并没有帮助我,我相信这里的目标是将我的字典转换为数据(或其他东西),在我检索到它之后,我将它转换回字典

【问题讨论】:

  • 来自文档:The NSUserDefaults class provides convenience methods for accessing common types such as floats, doubles, integers, Booleans, and URLs. A default object must be a property list, that is, an instance of (or for collections a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of NSData. For more details, see Preferences and Settings Programming Guide. 事件不是其中之一,这就是我们在 Objective-C 中使用编码/解码的原因。
  • 谢谢@Larme,如果您有什么想看的,我会尝试查找有关此转换的一些信息,请回答我。
  • 对于像这样的小对象,您可以使用initWithDictionary: 方法和toDictionary。将Event 对象转换为["Name":mySensorName,"Type":mySensorType, "Sub":mySensorSub"] 或类似的东西。
  • 好的,我会用这些做我的研究,再次感谢!

标签: ios dictionary nsuserdefaults


【解决方案1】:

尝试将数据转换为 NSData,然后像这样检索:

/// Save
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(object), forKey: key)

/// Read
var data = NSUserDefaults.standardUserDefaults().objectForKey(key) as NSData
var object = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [String: String]

【讨论】:

    【解决方案2】:

    我认为从下面的链接中您将能够将 Dictionary 存储到 NSUserDefaults 中

    Swift NSUserDefaults not saving Dictionary?

    Saving dictionary into NSUserDefaults 可能会有所帮助

    【讨论】:

      【解决方案3】:

      我设法使用 Realm 保存了我的自定义字典! 我使用不同的类而不是结构:

      import RealmSwift
      
      
      class Sensors : Object {
      
      
          dynamic var sensorName = ""
          dynamic var sensorType = ""
          dynamic var sensorSub = ""
      
      }
      

      然后我这样填写:

          var useOfRealm = try! Realm() 
          var allSensors = useOfRealm.objects(Sensors.self)
          var saving = Sensors()
          func fillThis() {
          try! useOfRealm.write {
      
                      saving.sensorName = "something"
                      saving.sensorType = "something"
                      saving.sensorSub = "something"
      
                      useOfRealm.add(saving)
          }
      }
      

      使用带参数的函数,以便动态填充“字典”。

      使用allSensors,这样您就可以检索所需的一切。

      【讨论】:

        猜你喜欢
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        相关资源
        最近更新 更多