Ich versuche ein Objekt zu kodieren und habe einige Probleme. Es funktioniert gut mit Strings, Booleans und anderen, aber ich weiß nicht, wie man es für enum verwendet. Ich brauche dies zu kodieren:Wie archiviere enum mit einem zugehörigen Wert?
enum Creature: Equatable {
enum UnicornColor {
case yellow, pink, white
}
case unicorn(UnicornColor)
case crusty
case shark
case dragon
ich diesen Code für kodieren bin mit:
func saveFavCreature(creature: Dream.Creature) {
let filename = NSHomeDirectory().appending("/Documents/favCreature.bin")
NSKeyedArchiver.archiveRootObject(creature, toFile: filename)
}
func loadFavCreature() -> Dream.Creature {
let filename = NSHomeDirectory().appending("/Documents/favCreature.bin")
let unarchived = NSKeyedUnarchiver.unarchiveObject(withFile: filename)
return unarchived! as! Dream.Creature
}
Hier ist erforderlich, Funktionen (model.favoriteCreature == Dream.Creature)
override func encode(with aCoder: NSCoder) {
aCoder.encode(model.favoriteCreature, forKey: "FavoriteCreature")
aCoder.encode(String(), forKey: "CreatureName")
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let favoriteCreature = aDecoder.decodeObject(forKey: "FavoriteCreature")
let name = aDecoder.decodeObject(forKey: "CreatureName")
}
Es funktioniert gut mit "name", ich denke, das Problem ist in aCoder.encode() coz ich weiß nicht, welcher Typ dort zu schreiben. Ich bekomme nächsten Fehler beim Ausführen: - [_ SwiftValue encodeWithCoder:]: unerkannter Selektor an Instanz gesendet - [NSKeyedArchiver Dealloc]: Warnung: NSKeyedArchiver freigegeben, ohne -finishEncoding aufgerufen haben.
Ich las einige Hinweise in den Kommentaren und davon ausgehen können, dass ich keine RawValues in Enum Kreatur haben, i roh Typ "String" in diesem Enum gemacht:
enum Creature: String, Equatable {
enum UnicornColor {
case yellow, pink, white
}
case unicorn(UnicornColor)
case crusty
case shark
case dragon
Jetzt habe ich diesen Fehler: Enum mit rohem Typ kann keine Fälle mit Argumenten enthalten. Ich habe auch gelesen, dass verknüpfte Werte und Rohwerte nicht koexistieren können. Vielleicht gibt es eine andere Möglichkeit, enum ohne rohe Werte zu archivieren?
Hoffnung jemand kann mir helfen, dankt die
Unrelated zu Ihrem Problem, aber mit 'NSHomeDirectory(). Anhängt ("/ Dokumente/favCreature.bin")' Ihr Weg ist falsch zu bauen. Suchen Sie nach 'documentDirectory', um viele Beispiele zu finden. – rmaddy
Danke dafür! –
Sie müssen einen 'rawValue' mit Ihrer Enumeration und encore/decodieren mit dem verwenden – Paulw11