swift: nscoding decodeObject с нолем все время

Я получил следующие коды для записи объекта с именем «Пакет» и отправки на другую сторону через соединение Multipeer. Однако при попытке декодировать закодированный объект я получил следующую ошибку.

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» фатальная ошибка: неожиданно найден nil при развертывании необязательного значения 2016-09-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:

Я кодировал двойное значение. Используйте 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") } 
  • UITableView не отображает ячейки (используя быстрый)
  • Проведите по удалению, но кнопка удаления не
  • Неверный пользовательский вид - self.frame?
  • Преобразование строки на сегодняшний день (Swift)
  • Модифицированный URLSession.shared для реализации закрепления сертификата, как они это сделали?
  • Swift Bridging Header и видимость класса Obj-C
  • Динамические строки с заполнителями и множественная поддержка в Swift (iOS)
  • Многострочный редактируемый текст UITextview внутри UIAlertController?
  • Swift Generics: IntegerType Version Works, но не FloatingPointType
  • Присвоить переменной или вернуть ее прямо сейчас не работает
  • NSLayoutConstraint в быстрой
  • Давайте будем гением компьютера.