我正在使用带有 Swift 3.0 的 Xcode8 Beta。我试图编码一个基于 NSObject 的简单对象,但我无法解码 Int 或 NSInteger 类型。 (编码过程OK)
代码
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")
}
}
最佳答案
问题是 seq2
不是 Int
,而是 Int?
可选的。它不能表示为 Objective-C 整数。
你可以使用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()
}
或更改它,使其不是可选的:
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)>" }
}
关于objective-c - 无法在 Swift 中使用 NSCoder 解码 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38072295/