2016-10-06 4 views
-1

einen Absturz von NSKeyedArchiver ErsteSwift 3 - NSCoding ohne Ärger von NSObject erbt

2016-10-06 17:06:06.713 MessagesExtension[24473:2175316] *** NSForwarding: 
warning: object 0x61800009d740 of class '' does not implement 
methodSignatureForSelector: -- trouble ahead 
Unrecognized selector -[MessagesExtension.Model replacementObjectForKeyedArchiver:] 

ich ein Protokoll erstellt haben genannt Codierung, die ganze Zweck ist, ist zu vereinfachen NSCoding und NSKeyedArchiver ohne die Notwendigkeit, Teile von Objective-C zu verwenden.

Dieses Protokoll und diese Erweiterung sollen NSCoding vereinfachen und ermöglichen, dass das Protokoll auf Struts verwendet wird. Dennoch renne ich in den Absturz oben, wenn ich versuche, das Objekt zu speichern.

Genauer gesagt, erhalte ich, dass Crash auf der Rückleitung von

func save(to path: String) -> Bool { 
    guard let url = Self.directoryURL else { return false } 

    return NSKeyedArchiver.archiveRootObject(self.encode() as NSDictionary, toFile: url + path) 
} 

Ich habe das Gefühl, es hat etwas mit NSDictionary zu tun hat, aber ich bin nicht sicher, wie es weitergeht.

Irgendwelche Vorschläge ??

+0

Sie könnten versuchen, Ihre Klasse implementieren alle Funktionen unter "Archivierung" in https://developer.apple.com/reference/objectivec/nsobject aber wirklich, 'NSCoding' ist eng an' NSObject' gekoppelt – Paulw11

+1

Warum ist NSObject fehlerhaft? – matt

+0

Ziel ist es, Strukturen zu archivieren. Das ist nicht möglich, wenn Sie _NSObject_ verwenden müssen. –

Antwort

3

Die Stiftung Archivierungssystem (NSCoding und verwandte Arten) wurden vor in Objective-C eine lange Zeit, die für und umgesetzt (Teile davon sind über 20 Jahre alt), und erwartet, „Objekte“ Instanzen von NSObject zu sein. Es ist einfach nicht realistisch, zu versuchen, es zu verwenden, um Objektgraphen zu codieren, die nicht-ähnliche Objekte enthalten. Sie können es vielleicht in Swift vereinfachen, aber Sie müssen sicherstellen, dass alles, was der Archivierer denkt, ein NSObject implementiert die notwendigen Teile der NSObject API. Da es keine Dokumentation darüber gibt, welche Teile vom Archivierer verwendet werden, ist die einzige Alternative die Unterklasse NSObject.

Ich könnte natürlich falsch liegen, aber Sie haben uns nicht die relevanten Teile des Codes (speziell die Implementierungen von encode) gezeigt.

+0

Das war mein Problem. Das Protokoll funktioniert korrekt, aber meine Implementierung von _encode_ war fehlerhaft. Ich habe keine richtige Kopie eines Wörterbuchs richtig gemacht. Vielen Dank! –

0

Falls Sie es noch nicht gesehen haben Vishal S hat einen sehr schönen Artikel über die verschiedenen Möglichkeiten zusammengestellt, wie Sie (derzeit) Daten in einer Struktur speichern können.

Archiving and Unarchiving Swift Structure Instances

oder als Vishal es ausdrückte

„Swift eine enorme anmount von Typsicherheit eingeführt. Aber Archive immer verlieren die Typen der Objekte. Bis zu einem besseren Weg entlang zu tun kommt Indem wir alle Prinzipien von Swift unterstützen, sollten wir mit dem, was wir haben, zufrieden sein. "

Natürlich könnte man (auf die Gefahr hin, die SO-Oberherren zu beleidigen) vorschlagen, dass sich die Apple Gurus etwas Mühe geben, eine Struktur (& Typ) freundliche Mittel zur Speicherung Ihrer Daten (!) Zu entwickeln. Sag es einfach. . .

und viel Glück w das Protokoll.

Verwandte Themen