一尘不染

使用NSCoding将自定义Swift类保存到UserDefaults

swift

我目前正在尝试将自定义Swift类保存到NSUserDefaults。这是我的游乐场代码:

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(属性列表不能包含’CFType’类型的对象)”

有人可以帮忙吗?我在Maverick上使用Xcode 6.0.1。谢谢。


阅读 251

收藏
2020-07-07

共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
}
2020-07-07