4

私は、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 
    } 

何が原因でエラーが発生するのだろうか。ありがとう。

+2

あなたはキー –

+3

ためdecodeDoubleを使用する必要が '聞かせTMP1 = aDecoder.decodeDouble(forKey:PropertyKey.tmp1Key)' –

+1

上記のコメントは、あなたが整数の特定のデコードを使用する必要が述べたようにフロート、ブール、ダブルスなど。 – mn1

答えて

3

スウィフト3:

私は2倍の値をエンコードしていました。値がエンコードされているかどうかを確認するには、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") 
     } 
関連する問題