Speichern Sie struct in der Klasse NSUserDefaults mit Swift

8

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.

    
Thomas 28.08.2014, 10:36
quelle

3 Antworten

10

Swift-Strukturen sind keine Klassen , daher entsprechen sie nicht dem AnyObject -Protokoll. Sie müssen Ihren Ansatz überdenken. Hier sind einige Vorschläge:

  1. Konvertiere dein struct in final class , um Unveränderlichkeit zu erzwingen

    %Vor%
  2. Ordnen Sie sie als Array-Wörterbücher vom Typ [String: NSDate]

    zu %Vor%
akashivskyy 28.08.2014 11:35
quelle
6

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.

    
zaph 28.08.2014 11:31
quelle
0

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:

%Vor%

Seitdem können Sie die Struktur leicht in Data und zurück konvertieren:

%Vor%

Schließlich implementieren Sie NSCoding :

%Vor%

Es ist so ziemlich der gleiche Code, den Sie schreiben würden, wenn NSCoding Swift-Strukturen unterstützt.

    
Artem Stepanenko 14.01.2017 02:54
quelle