私は、Packetという名前のオブジェクトを書くときに次のコードを取得し、Multipipe接続を通して相手側に送信します。ただし、エンコードされたオブジェクトをデコードしようとするたびに、次のエラーが発生します。swift:nscoding decodeObjectを常にnilにする
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オプションの値をアンラップしながら、予想外にはnilが見つかりました: 55.901189 Connection [323:33022]致命的なエラー:オプション値のアンラッピング中に予期せぬ結果が発生しました。
しかし、オブジェクトを構築すると、すべての値が設定されます。 私は問題なしでPacketオブジェクトを契約しました。
----追加情報------ マルチプライヤ接続を介して相手側にデータを送信するときに、次のコードを使用してデータのエンコードとデコードを行いました。
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
}
何が原因でエラーが発生するのだろうか。ありがとう。
あなたはキー –
ためdecodeDoubleを使用する必要が '聞かせTMP1 = aDecoder.decodeDouble(forKey:PropertyKey.tmp1Key)' –
上記のコメントは、あなたが整数の特定のデコードを使用する必要が述べたようにフロート、ブール、ダブルスなど。 – mn1