我目前正在尝试将自定义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…)
ud.setObject
在带有消息的应用程序中,相同的代码也会崩溃
“属性列表对于格式无效:200(属性列表不能包含’CFType’类型的对象)”
有人可以帮忙吗?我在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 }