オブジェクトをエンコードしようとしていますが、いくつか問題があります。文字列、ブール値などでは問題なく動作しますが、enumにどのように使用するのか分かりません。関連付けられた値でenumをアーカイブするには?
enum Creature: Equatable {
enum UnicornColor {
case yellow, pink, white
}
case unicorn(UnicornColor)
case crusty
case shark
case dragon
私はエンコードのために、このコードを使用しています:ここで
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
}
は、必要な機能(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")
}
である私はこれをエンコードする必要があり
これは "name"とうまく動作しますが、問題はaCoder.encode()にあります。私はそこに書き込むタイプがわかりません。 - [_ SwiftValue encodeWithCoder:]:インスタンスに送信された認識できないセレクタ - [NSKeyedArchiver dealloc]:警告:NSKeyedArchiverは、-finishEncodingを呼び出さずに割り当てを解除しました。
私はコメントでいくつかのアドバイスを読んで、私は列挙型クリーチャーにはrawValuesを持っていないと仮定することができ、私はその列挙中生タイプ「string」を作っ:
enum Creature: String, Equatable {
enum UnicornColor {
case yellow, pink, white
}
case unicorn(UnicornColor)
case crusty
case shark
case dragon
今、私はこのエラーを持っている:生と 列挙型は引数を持つ大文字小文字を持つことはできません また、関連する値と生の値が混在することはありません。おそらく、生の値を持たないenumをアーカイブする別の方法がありますか?
誰かが私を助けることを願って、あなたの問題のために感謝の
が、 'NSHomeDirectory()を使用して。あなたのパスを構築するために、'( "/ドキュメント/ favCreature.bin")を追加することは間違っています。多くの適切な例を見つけるために 'documentDirectory'を検索してください。 – rmaddy
ありがとう! –
「rawValue」をエニュメレーションに関連付け、encore/decodeする必要があります。 – Paulw11