【问题标题】:How do I save structs after my app closes? [duplicate]我的应用程序关闭后如何保存结构? [复制]
【发布时间】:2020-03-06 01:53:15
【问题描述】:

我知道有很多方法可以在应用程序关闭后保存数据 - NSCoding、CoreData 和 NSKeyedArchiver 仅举几例 - 但它们都不支持存储自定义结构(对吗?)有什么方法可以存储像这样的结构到内存中?我想存储 items 变量(如果必须的话,还有 myStruct)。

struct myStruct {
    var text: String
    var isDone: Bool
}

var items = [Int: [myStruct]]()

一如既往地感谢任何帮助!再次感谢!

【问题讨论】:

    标签: ios swift struct


    【解决方案1】:

    据我所知,CoreData 实际上确实支持自定义结构。唯一的限制是这些结构中允许的唯一数据类型是原始数据类型和NSData。然而,这很容易克服,因为将任何一个自定义对象编码为 NSData 对象非常容易。

    【讨论】:

      【解决方案2】:

      使用 Codable 归档

      您可以使用Codable 协议和NSKeyedArchiver 来执行此操作。

      使您的struct 符合Codable 协议。如果所有struct 的属性也符合Codable,则您无需做任何额外的事情,这对于IntDouble、Stringand others. Even nestedstructs andenum 等基本类型是正确的如果它们自己的属性属于这些基本类型,则它们将是可编码的。

      请注意,如果您使用的其他自定义类型不是从符合 Codable 的类继承的,则需要为该类型添加自己的编码键,以便以这种方式存档。

      只需在声明中添加协议即可:

      struct myStruct: Codable {
          var text: String
          var isDone: Bool
      }
      
      var items = [Int: [myStruct]]()
      

      然后您可以像这样保存项目:

      do {
          let myData: Data = try NSKeyedArchiver.archivedData(withRootObject: items, requiringSecureCoding: false)
          try myData.write(to: fileURL)
      } catch {
          // Error handling
      }
      

      这里fileURL应该是文件系统中某个位置的URL。

      您可以像这样加载项目:

      do {
          let myData = try Data(contentsOf: fileURL)
          if let items = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(myData) as? [Int : [myStruct]] {
              // Use the data here
          }
      } catch {
          // Error handling
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多