swift:nscoding decodeObject始终为零
问题描述:
我在编写名为Packet的对象时通过以下代码并通过Multipeer连接发送到另一端。但是,每当它尝试解码编码对象时,我都会收到以下错误。swift:nscoding decodeObject始终为零
class Packet : NSObject, NSCoding {
var tmp1: Double = 0
var tmp2: Double = 0
struct PropertyKey {
static let tmp1Key = "tmp1Key"
static let tmp2Key = "tmp2Key"
}
init(tmp1: Double, tmp2: Double) {
self.tmp1 = tmp1
self.tmp2 = tmp2
super.init()
}
deinit {
}
required convenience init(coder aDecoder: NSCoder) {
debugPrint("initcoder")
let tmp1 = aDecoder.decodeObject(forKey: PropertyKey.tmp1Key) as! Double // crash here
let tmp2 = aDecoder.decodeObject(forKey: PropertyKey.tmp2Key) as! Double
self.init(tmp1: tmp1, tmp2: tmp2)
}
public func encode(with aCoder: NSCoder) {
debugPrint("encodeCoder")
aCoder.encode(tmp1, forKey: PropertyKey.tmp1Key)
aCoder.encode(tmp2, forKey: PropertyKey.tmp2Key)
}
}
我得到的错误是 ----从我打印出----“initcoder” 致命错误:意外发现零而展开的可选值 2016年9月30日13:32: 55.901189连接[323:33022]致命错误:意外发现零,同时展开一个可选值
但是当我构造对象时,所有的值都被设置。 我签约了一个没有问题的数据包对象。
----附加信息------ 我用下面的代码编码,并且当通过乘法器连接发送到另一侧进行解码的数据。
func dataForPacket(packet: Packet) -> Data {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(packet, forKey: "Packet")
archiver.finishEncoding()
debugPrint("dataForPacket \(data) \(packet)")
return data as Data
}
func packetForData(_ data: Data) -> Packet {
debugPrint("packetForData")
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
let packet: Packet = unarchiver.decodeObject(forKey: "Packet") as! Packet
// crash here (as this will call the init of the Packet class)
debugPrint("packetForData \(packet)")
return packet
}
我想知道什么会导致错误。谢谢。
答
Swift 3:
我正在编码一个double值。使用decoder.containsValue来检查一个值是否被编码。
并使用decodeDouble(forKey :)。不decodeObject(forKey :)
var dateTime: TimeInterval = SOME_TIME_INTERVAL (Double)//Can be saved(encoded) previously, and not encoded as well.
aCoder.encode(dateTime, forKey: "dateTime")
if decoder.containsValue(forKey: "dateTime") {
dateTime = decoder.decodeDouble(forKey: "dateTime")
}
您需要使用decodeDouble关键 –
'让TMP1 = aDecoder.decodeDouble(forKey:PropertyKey.tmp1Key)' –
由于上述意见提到,你必须使用特定的整数解码,浮球,布尔,双打等。 – mn1