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
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
File system :
NSKeyedArchiver.archiveRootObject(student, toFile: "Here give your file path")
NSUserDefaults :
let data = NSKeyedArchiver.archivedDataWithRootObject(student)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "student")
Unarchiving
File system :
NSKeyedUnarchiver.unarchiveObjectWithFile(student, toFile: "Here give your file path")
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")
}