Swift NSCoding Not working

前端 未结 4 1726
小蘑菇
小蘑菇 2020-12-23 21:53

I\'m having trouble using NSCoding in Swift. I have attempted to implement the protocol but I get a crash whenever I call my save() method. Xcode p

4条回答
  •  醉话见心
    2020-12-23 22:25

    class Student: NSObject, NSCoding {
        var name: String!
        var className: String!
        var rollNo: Int!
        var marks: [Float]!
    
    
        // MARK: NSCoding
    
        required convenience init(coder decoder: NSCoder) {
            self.init()
            self.name = decoder.decodeObjectForKey("name") as String?
            self.className = decoder.decodeObjectForKey("className") as String?
            self.rollNo = decoder.decodeIntegerForKey("rollNo")
            self.marks = decoder.decodeObjectForKey("marks") as [Float]!
    
        }
    
        func encodeWithCoder(coder: NSCoder) {
            coder.encodeObject(self.name, forKey: "name")
            coder.encodeObject(self.className, forKey: "className")
            coder.encodeInt(Int32(self.rollNo), forKey: "rollNo")
            coder.encodeObject(self.marks, forKey: "marks")
    
        }
    }
    

    Above class string,integer,array encoding are implemented.

    suppose student is an instance of class Student

    Archiving

    1. File system :

      NSKeyedArchiver.archiveRootObject(student, toFile: "Here give your file path")
      
    2. NSUserDefaults :

      let data = NSKeyedArchiver.archivedDataWithRootObject(student)
      NSUserDefaults.standardUserDefaults().setObject(data, forKey: "student")
      

    Unarchiving

    1. File system :

      NSKeyedUnarchiver.unarchiveObjectWithFile(student, toFile: "Here give your file path")
      
    2. NSUserDefaults :

      if let data = NSUserDefaults.standardUserDefaults().objectForKey("student") as? NSData {
          let student = NSKeyedUnarchiver.unarchiveObjectWithData(data)
      }
      

    Addit:

    File path for saving / reading

    func saveFileLocation() -> String {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let documentDirectory = paths[0] as! String
        return documentDirectory.stringByAppendingPathComponent("savefile")
    }
    

提交回复
热议问题