Ich habe eine Klasse und innerhalb der Klasse ist ein (swift) Array, basierend auf einer globalen Struktur. Ich möchte ein Array mit dieser Klasse in NSUserDefaults speichern. Das ist mein Code:
%Vor%Ich habe bereits nach NSObject subklassifiziert, und ich weiß, dass ich NSCoding brauche. Aber ich finde keine Möglichkeit, das struct-Array in ein NSMuteableArray oder etwas Ähnliches zu konvertieren, das ich speichern kann. Die einzige Idee bis jetzt ist es, jeden Eintrag durchzugehen und ihn direkt in ein neues Array zu kopieren oder viel oder objective-c Code über das ganze Projekt zu verwenden, so dass ich nie von schnellen Arrays in objektive-c Arrays konvertieren muss. Beides sind Dinge, die ich nicht tun möchte.
Swift-Strukturen sind keine Klassen , daher entsprechen sie nicht dem AnyObject
-Protokoll. Sie müssen Ihren Ansatz überdenken. Hier sind einige Vorschläge:
Konvertiere dein struct
in final class
, um Unveränderlichkeit zu erzwingen
Ordnen Sie sie als Array-Wörterbücher vom Typ [String: NSDate]
NSUserDefaults
ist in den folgenden Typen eingeschränkt: NSData
, NSString
, NSNumber
, NSDate
, NSArray
, NSDictionary
und Bool
. So können no Schnelle Objekte oder Strukturen gespeichert werden. Alles andere muss in ein NSData
-Objekt konvertiert werden.
NSUserDefaults
funktioniert nicht wie NSArchiver
. Da Sie Ihren Klassen bereits NSCoder
hinzugefügt haben, könnte es am besten sein, mit NSArchiver
in einer Datei im Verzeichnis Documents
zu speichern und wiederherzustellen.
Von Apple NSUserDefaults
Docs:
Ein Standardobjekt muss eine Eigenschaftsliste sein, dh eine Instanz von (oder für Sammlungen eine Kombination von Instanzen von): NSData, NSString, NSNumber, NSDate, NSArray oder NSDictionary. Wenn Sie irgendwelche speichern möchten Andere Art von Objekt sollten Sie normalerweise archivieren, um ein Objekt zu erstellen Instanz von NSData.
Ich habe eine kleine Bibliothek entwickelt, die helfen kann. Sie können es als Ersatz für NSCoding
für Swift-Strukturen verwenden.
Sie müssten ein Koting
-Protokoll für mystruct
implementieren:
Seitdem können Sie die Struktur leicht in Data
und zurück konvertieren:
Schließlich implementieren Sie NSCoding
:
Es ist so ziemlich der gleiche Code, den Sie schreiben würden, wenn NSCoding
Swift-Strukturen unterstützt.
Tags und Links ios swift nsuserdefaults uiimageview nscoding