Swift 在iOS中将字典保存到UserDefaults、file和NSCache

Swift 在iOS中将字典保存到UserDefaults、file和NSCache,swift,dictionary,nsuserdefaults,Swift,Dictionary,Nsuserdefaults,我在将字典数据保存到UserDefaults、NSCache和文件中时遇到问题,我试图找出我做错了什么,但到目前为止我没有任何进展。 我会尽量简化我的问题 struct Notes { var ntitle: String! var username: String! var snapshot: FIRDataSnapshot var key: String! var uid: String!

我在将字典数据保存到UserDefaults、NSCache和文件中时遇到问题,我试图找出我做错了什么,但到目前为止我没有任何进展。 我会尽量简化我的问题

     struct Notes {


        var ntitle: String!
        var username: String!
        var snapshot: FIRDataSnapshot
        var key: String!
        var uid: String!
        var ref: FIRDatabaseReference?


        init(ntitle: String, username: String, uid: String,key: String, ref: FIRDatabaseReference!, snapshot: FIRDataSnapshot ){
            self.username = username
            self.ntitle = ntitle
            self.uid = uid
            self.key = key
            self.snapshot = snapshot

            self.ref = ref

        }

        func toAnyObject() -> [String: AnyObject] {


            return ["ntitle": ntitle as AnyObject, "username": username as AnyObject, "uid": uid as AnyObject]


        }



    }


   class NotesController: UITableViewController  {

   var notesdict = [Notes]()


    override func viewDidAppear(_ animated: Bool) {

        DispatchQueue.main.async{
            self.tableView.reloadData()
        }



        var newItems = [Notes]()


        if FIRAuth.auth()?.currentUser == nil {

            let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Login")
            self.present(vc, animated: true, completion: nil)
        }

        else {

            guard  let uid = FIRAuth.auth()?.currentUser?.uid else {
                return
            }
            let ref = FIRDatabase.database().reference().child("user-Notes").child(uid)

            ref.observe(.childAdded, with: { (snapshot) in

                let postID = snapshot.key
                let postReference = FIRDatabase.database().reference().child("/Notes/\(postID)")

                postReference.observe(.value, with: { (snapshot) in

                    let reff = FIRDatabase.database().reference()

  if snapshot.hasChildren() == true{

                        let newTodos = Notes(ntitle: ((snapshot.childSnapshot(forPath: "ntitle").value as? String as AnyObject??)! ?? ("" as AnyObject?)!) as! String,username: ((snapshot.childSnapshot(forPath: "username").value as? String as AnyObject??)! ?? ("" as AnyObject?)!) as! String,uid: ((snapshot.childSnapshot(forPath: "uid").value as? String as AnyObject??)! ?? ("" as AnyObject?)!) as! String, key: snapshot.key, ref: snapshot.ref, snapshot: snapshot)


                        newItems.insert(newTodos, at: 0)

                        self.notesdict = newItems



                    }
                })



            }, withCancel: nil)

        }

        self.tableView.reloadData()
    }

我只是想以后保存和使用notesdict[Notes]类型,我几乎尝试了一切。。。。如果有人有什么想法,我将不胜感激。

请清理代码,以下语法:
值为?字符串作为任何对象??)太可怕了。并将
Notes
中的所有
String
属性声明为非可选,因为初始值设定项传递非可选值。如果您想将
Notes
中的所有属性保存为用户默认值,请将
struct
更改为
class
继承自
NSObject
,并实现
NSCoding
是的,这个新方法非常糟糕,我打赌您的问题就在那里。此外,NSUserDefaults并不是为了这个,就像它的名字说的那样,它是为了保存用户的默认设置,比如f.e:设置,最后是一些简单的键。如果你想这样做,你最好学习核心数据或领域。@vadian谢谢,现在它可以工作了,你保存我的day@kam.voick-带字符串的dict的核心数据,我认为这不是好的解决方案请清理代码,此语法:
value as?字符串作为任何对象??)太可怕了。并将
Notes
中的所有
String
属性声明为非可选,因为初始值设定项传递非可选值。如果您想将
Notes
中的所有属性保存为用户默认值,请将
struct
更改为
class
继承自
NSObject
,并实现
NSCoding
是的,这个新方法非常糟糕,我打赌您的问题就在那里。此外,NSUserDefaults并不是为了这个,就像它的名字说的那样,它是为了保存用户的默认设置,比如f.e:设置,最后是一些简单的键。如果你想这样做,你最好学习核心数据或领域。@vadian谢谢,现在它可以工作了,你保存我的day@kam.voick-带字符串的dict的核心数据,我认为这不是一个好的解决方案