1. ホーム
  2. swift

[解決済み] NSCodingを使用したSwiftのカスタムクラスをUserDefaultsに保存する

2023-06-15 01:42:47

質問

私は現在、NSUserDefaults にカスタム Swift クラスを保存しようとしています。以下は、私のプレイグラウンドからのコードです。

import Foundation

class Blog : NSObject, NSCoding {

    var blogName: String?

    override init() {}

    required init(coder aDecoder: NSCoder) {
        if let blogName = aDecoder.decodeObjectForKey("blogName") as? String {
            self.blogName = blogName
        }
    }

    func encodeWithCoder(aCoder: NSCoder) {
        if let blogName = self.blogName {
            aCoder.encodeObject(blogName, forKey: "blogName")
        }
    }

}

var blog = Blog()
blog.blogName = "My Blog"

let ud = NSUserDefaults.standardUserDefaults()    
ud.setObject(blog, forKey: "blog")

このコードを実行すると、次のようなエラーが発生します。

実行は中断されました、理由はシグナルSIGABRTです。

は、最後の行の ( ud.setObject ...)

同じコードで、アプリ内で以下のようなメッセージを表示するとクラッシュします。

"プロパティリストのフォーマットが無効です。200 (プロパティ リストには オブジェクトを含むことができません)。

どなたか助けていただけませんか。私はMaverick上でXcode 6.0.1を使用しています。ありがとうございます。

どのように解決するのですか?

dan-beaulieuが提案したように、私は自分自身の質問に答えました。

これが今動いているコードです。

注:クラス名の分離は、コードがPlaygroundsで動作するために必要ではありませんでした。

import Foundation

class Blog : NSObject, NSCoding {

    var blogName: String?

    override init() {}

    required init(coder aDecoder: NSCoder) {
        if let blogName = aDecoder.decodeObjectForKey("blogName") as? String {
            self.blogName = blogName
        }
    }

    func encodeWithCoder(aCoder: NSCoder) {
        if let blogName = self.blogName {
            aCoder.encodeObject(blogName, forKey: "blogName")
        }
    }

}

let ud = NSUserDefaults.standardUserDefaults()

var blog = Blog()
blog.blogName = "My Blog"

ud.setObject(NSKeyedArchiver.archivedDataWithRootObject(blog), forKey: "blog")

if let data = ud.objectForKey("blog") as? NSData {
    let unarc = NSKeyedUnarchiver(forReadingWithData: data)
    let newBlog = unarc.decodeObjectForKey("root") as Blog
}