如何将自定义类的数组转换为数据?

时间:2019-04-24 14:47:34

标签: ios swift

我想将自定义Note()类的数组转换为Data(),以便以后对其进行加密并存储。

我的课是

class Note: NSObject {
    var text = "hi"
    var date = Date()
}

上面的类是一个示例。我的课会更复杂。

我尝试过

let plistData = NSKeyedArchiver.archivedData(withRootObject: mergedNotes)

if let a: Array<Note> = NSKeyedUnarchiver.unarchiveObject(with: plistData) as? Array<Note> {
    print(a)
}

以上代码因信号异常而崩溃。

这是如何工作的,并且不对整个类进行解码就可以实现吗?

1 个答案:

答案 0 :(得分:0)

首先设置您的Note类,必须符合可编码协议:

class Note: Codable {
   var text = "hi"
   var date = Date()

   init(t: String, d: Date) {
      text = t
      date = d
   }

   enum CodingKeys: String, CodingKey {
      case text
      case date
   }

   required init(from decoder: Decoder) throws {
      let container = try decoder.container(keyedBy: CodingKeys.self)

      text = try container.decode(String.self, forKey: .text)
      date = try container.decode(Date.self, forKey: .date)
   }

   func encode(to encoder: Encoder) throws {
      var container = encoder.container(keyedBy: CodingKeys.self)

      try container.encode(text, forKey: .text)
      try container.encode(date, forKey: .date)
   }
}

然后您可以创建一系列笔记:

let arrayOfNotes: [Note] = [Note(t: "someNote", d: Date())]

并将其保存为用户默认设置:

do {
    let encoded = try JSONEncoder().encode(arrayOfNotes)
    UserDefaults.standard.set(encoded, forKey: "SavedNotes")
} catch let error {
    // catch any error if present
    print(error)
}

要检索已保存的数据,您可以简单地使用if let或do-catch,如上:

if let savedData = UserDefaults.standard.value(forKey: "SavedNotes") as? Data {
   if let notes = try? JSONDecoder().decode(Note.self, from: savedData) {
    // do whatever you need
   }
}