The problem is that seq2 not Int , but rather a Int? optional. It cannot be represented as an integer of Objective-C.
You can use decodeObject :
required init?(coder aDecoder: NSCoder){ self.seq = aDecoder.decodeObject(forKey: "seq") as? NSNumber self.seq2 = aDecoder.decodeObject(forKey: "seq2") as? Int self.id = aDecoder.decodeObject(forKey: "id") as? String self.value = aDecoder.decodeObject(forKey: "value") as? String super.init() }
or change it so that it is not optional:
class Model : NSObject, NSCoding { var seq: NSNumber? var seq2: Int var id: String? var value: String? init(seq: NSNumber, seq2: Int, id: String, value: String) { self.seq = seq self.seq2 = seq2 self.id = id self.value = value super.init() } required init?(coder aDecoder: NSCoder) { self.seq = aDecoder.decodeObject(forKey: "seq") as? NSNumber self.seq2 = aDecoder.decodeInteger(forKey: "seq2") self.id = aDecoder.decodeObject(forKey: "id") as? String self.value = aDecoder.decodeObject(forKey: "value") as? String super.init() } func encode(with aCoder: NSCoder) { aCoder.encode(seq, forKey: "seq") aCoder.encode(seq2, forKey: "seq2") aCoder.encode(id, forKey: "id") aCoder.encode(value, forKey: "value") } override var description: String { return "<Model; seq=\(seq); seq2=\(seq2); id=\(id); value=\(value)>" } }
source share