使用NSCoding將自定義Swift類保存到UserDefaults我目前正在嘗試將自定義Swift類保存到NSUserDefaults。這是我的Playground的代碼:import Foundationclass 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")當我運行代碼時,我收到以下錯誤執(zhí)行被中斷,原因:信號SIGABRT。在最后一行(ud.setObject...)在帶有消息的應用程序中,相同的代碼也會崩潰“屬性列表格式無效:200(屬性列表不能包含'CFType'類型的對象)”有人可以幫忙嗎?我在Maverick上使用Xcode 6.0.1。謝謝。
3 回答

動漫人物
TA貢獻1815條經(jīng)驗 獲得超10個贊
第一個問題是你必須確保你有一個非破壞的類名:
@objc(Blog)class Blog : NSObject, NSCoding {
然后,您必須先將對象編碼(轉換為NSData),然后才能將其存儲到用戶默認值中:
ud.setObject(NSKeyedArchiver.archivedDataWithRootObject(blog), forKey: "blog")
同樣,要恢復對象,您需要取消歸檔它:
if let data = ud.objectForKey("blog") as? NSData { let unarc = NSKeyedUnarchiver(forReadingWithData: data) unarc.setClass(Blog.self, forClassName: "Blog") let blog = unarc.decodeObjectForKey("root")}
請注意,如果您沒有在操場上使用它,那么您可以手動注冊課程,這樣會更簡單:
if let data = ud.objectForKey("blog") as? NSData { let blog = NSKeyedUnarchiver.unarchiveObjectWithData(data)}

森林海
TA貢獻2011條經(jīng)驗 獲得超2個贊
在Swift 4中,使用Codable。
在您的情況下,請使用以下代碼。
class Blog : Codable { var blogName: String?}
現(xiàn)在創(chuàng)建它的對象。例如:
var blog = Blog()blog.blogName = "My Blog"
現(xiàn)在編碼如下:
if let encoded = try? JSONEncoder().encode(blog) { UserDefaults.standard.set(encoded, forKey: "blog")}
并解碼它像這樣:
if let blogData = UserDefaults.standard.data(forKey: "blog"), let blog = try? JSONDecoder().decode(Blog.self, from: blogData) {}

ABOUTYOU
TA貢獻1812條經(jīng)驗 獲得超5個贊
正如@ dan-beaulieu建議我回答我自己的問題:
這是現(xiàn)在的工作代碼:
注意:代碼在Playgrounds中工作時不需要解析類名。
import Foundationclass 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}
- 3 回答
- 0 關注
- 1210 瀏覽
添加回答
舉報
0/150
提交
取消