andig
andig

Reputation: 13906

Can't store object in user defaults

I have a class that conforms to NSCoding:

class Middleware : NSObject, NSCoding {

    var name: String
    var uri: String

    // MARK: NSCoding

    required init?(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObject(forKey: "name") as! String
        uri = aDecoder.decodeObject(forKey: "uri") as! String
    }

    func encode(with: NSCoder) {
        with.encode(name, forKey: "name")
        with.encode(uri, forKey: "uri")
    }
}

Storing that class in UserDefaults fails:

userDefaults.set(Middleware(name: "Volkszaehler Demo", uri: "http://demo.volkszaehler.org/middleware.php"), forKey: "middlewares")

Gives:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object for key middlewares'

Upvotes: 1

Views: 117

Answers (1)

andig
andig

Reputation: 13906

Got it- custom object needs to go through the encoder first:

let encodedData = NSKeyedArchiver.archivedData(withRootObject: middleware)

encodedData can then be stored.

Upvotes: 1

Related Questions