【问题标题】:Save an Array of Data in Swift in NSUserDefaults在 NSUserDefaults 中保存 Swift 中的数据数组
【发布时间】:2015-09-22 13:25:45
【问题描述】:

我在SwiftXcode 中创建了一组数据。

我已经使用以下代码设置了一个结构来存储我的数据:

struct groups {
    var groupName: String!
    var groupPeripherals: [CBPeripheral]!
}

数组工作正常,并且数组一直保存到应用程序关闭。

然后我使用这个结构创建了一个数组:

var groupArray = [groups]()

在整个应用程序中,我已经像这样将数据附加到这个数组中,例如:

groupArray.append(groups(groupName: "Group 1", groupPeripherals: [peripheral info...]))

在我写“外围信息”的地方,它实际上将CBPeripheral 信息传递给了数组。

无论如何,问题。我希望能够将此数组存储在NSUserDefaults 中,并在我重新启动应用程序时能够读取它。我该怎么做呢?我知道如何将NSUserDefaults 与字符串和整数等一起使用,但不知道这种数组。任何帮助将不胜感激。

谢谢!

【问题讨论】:

标签: ios arrays swift nsuserdefaults


【解决方案1】:

NSUserDefaults 只能保存“property list objects”。 (有关支持的数据类型列表,请参阅链接。)

为了将数组保存为用户默认值,数组“object graph”中的每个对象都必须是属性列表类型。

您需要将结构转换为属性列表类型。您可以为您的对象实现 NSCoding,然后使用 NSKeyedArchiver 方法 archivedDataWithRootObject 将您的数组转换为 NSData 并保存。

或者,您可以在结构中定义辅助方法,将其转换为字典或从字典转换,然后使用 filter() 将您的 groups 结构数组转换为字典数组并将其保存为用户默认值。

编辑:

我看到您的结构包含CBPeripheral 对象。您需要将它们转换为可以保存为用户默认值的表单。一种选择是为 CBPeripheral 创建一个扩展,添加 NSCoding 支持。

一般来说,您希望避免将大量数据保存为用户默认值。您可能希望将数据保存到文档目录中的文件中。 (使用与写入用户默认值相同的技术。)

【讨论】:

  • 感谢您的回复。对此,我真的非常感激。我认为第一个选项可能对我来说是最好的。请问您将如何将结构转换为属性列表类型并保存(就代码而言)?我注意到你提到了 NSCoding,那么我该如何将它添加到我的项目中呢?
  • 阅读 NSCoding 上的文档。您需要更改您的对象以符合 NSCoding,这意味着支持方法 initWithCoderencodeWithCoder。请注意,这仅适用于从 NSObject 继承的对象,而 Swift 结构则不适用。您可能必须将结构转换为 NSObject。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多