How to archive and unarchive custom objects in Swift? Or how to save custom object to NSUserDefaults in Swift?
cocoa-touch, ios, ios8, swift
Solution
`NSKeyedArchiver` will only work with Objective-C classes, not pure Swift classes. You can bridge your class to Objective-C by marking it with the `@objc` attribute or by inheriting from an Objective-C class such as `NSObject`.
See Using Swift with Cocoa and Objective-C for more information.
Problem
I have a class ``` class Player { var name = "" func encodeWithCoder(encoder: NSCoder) { encoder.encodeObject(name) } func initWithCoder(decoder: NSCoder) -> Player { self.name = decoder.decodeObjectForKey("name") as String return self } init(coder aDecoder: NSCoder!) { self.name = aDecoder.decodeObjectForKey("name") as String } init(name: String) { self.name = name } } ``` and i want to serialise it and save to user defaults. First of all I'm not sure how to correctly write encoder and decoder. So for init i wrote two methods. When i try to execute this code: ``` func saveUserData() { let player1 = Player(name: "player1") let myEncodedObject = NSKeyedArchiver.archivedDataWithRootObject(player1) NSUserDefaults.standardUserDefaults().setObject(myEncodedObject, forKey: "player") } ``` app crashes and i get this message: ``` *** NSForwarding: warning: object 0xebf0000 of class '_TtC6GameOn6Player' does not implement methodSignatureForSelector: -- trouble ahead ``` What do i do wrong?