Failed to decode Int using NSCoder in Swift

I am using Xcode8 Beta with Swift 3.0. I tried to encode a simple base of objects in NSObject, but I cannot decode an Int or NSInteger type. (The coding process is fine)

enter image description here

codes

class Model : NSObject, NSCoding { var seq: NSNumber? var seq2: Int? // problem with seq2, NSInteger is not ok, either var id: String? var value: String? override init() { 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 } 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") } } 
+6
source share
3 answers

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)>" } } 
+6
source

Use the encodeInteger method to encode integers:

 func encode(with aCoder: NSCoder) { ... aCoder.encodeInteger(seq2, forKey: "seq2") } 
+1
source

Observe nil values

 func encode(with aCoder: NSCoder){ aCoder.encode(seq, forKey: "seq") if let second_seq = self.seq2 { aCoder.encode(second_seq, forKey: "seq2") } aCoder.encode(id, forKey: "id") aCoder.encode(value, forKey: "value") } 

seq2 will be nil if the key is missing when working with decoding

0
source

All Articles