在swift中将对象数组编码为UserDefaults时出错

在swift中将对象数组编码为UserDefaults时出错,swift,google-cloud-firestore,nsuserdefaults,Swift,Google Cloud Firestore,Nsuserdefaults,我有一个文件夹数组,其中存储名称和menuID,如下所示 struct Folder { let name:String let menu:[String:Any] } 然后我将从Firestore查询文件夹数组,然后设置为UserDefault var folders = [Folder]() func getFolders() { self.userFolders.getDocuments() { (querySnapshot, err) in if

我有一个文件夹数组,其中存储名称和menuID,如下所示

struct Folder {
    let name:String
    let menu:[String:Any]
}
然后我将从Firestore查询文件夹数组,然后设置为UserDefault

var folders = [Folder]()

func getFolders() {
    self.userFolders.getDocuments() { (querySnapshot, err) in
      if let err = err {
         print("Error getting Folders: \(err)")
      }
      else {
        for document in querySnapshot!.documents {
          let folder = Folder(name: document.documentID, menu: document.data())
           self.folders.append(folder)
        }
      }

      for f in self.folders {
         print(f)   // try to print out what is in self.folders
      }

      // try to encode the folders ** --- Error occurs in this line --- **
      let encodeFolders = NSKeyedArchiver.archivedData(withRootObject: self.folders)

      UserDefaults.standard.set(encodeFolders, forKey: "userFoldersArray")
   }
}
self.folders中的内容是

Folder(name: "Default", menu: ["menuID": ])
Folder(name: "Test", menu: ["menuID": ])
Folder(name: "all", menu: ["menuID": menu1])
Folder(name: "favorite", menu: ["menuID": menu2])
问题出在编码行。这是一个错误所说的:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x6000001e9d80'

我怎样才能解决这个问题?感谢您的建议。

NSCoding
需要
NSObjectProtocol
。只有类可以符合这一点,并且您正在使用结构。即:

struct Folder {
    let name:String
    let menu:[String:Any]
}

如果你愿意,你也可以详细阅读

使用
NSKeyedArchiver
时,需要使结构(以及所有子结构)符合
NSCoding
协议。你这么做了吗,我不这么认为。使用Codable这样做怎么样?我想我还没有这样做。那我就来看看Codable。谢谢你的建议。