亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用NSCoding將自定義Swift類保存到UserDefaults

使用NSCoding將自定義Swift類保存到UserDefaults

MMMHUHU 2019-07-26 15:59:00
使用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")當我運行代碼時,我收到以下錯誤執行被中斷,原因:信號SIGABRT。在最后一行(ud.setObject...)在帶有消息的應用程序中,相同的代碼也會崩潰“屬性列表格式無效:200(屬性列表不能包含'CFType'類型的對象)”有人可以幫忙嗎?我在Maverick上使用Xcode 6.0.1。謝謝。
查看完整描述

3 回答

?
動漫人物

TA貢獻1815條經驗 獲得超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)}


查看完整回答
反對 回復 2019-07-26
?
森林海

TA貢獻2011條經驗 獲得超2個贊

在Swift 4中,使用Codable。

在您的情況下,請使用以下代碼。

class Blog : Codable {

   var blogName: String?}

現在創建它的對象。例如:

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

現在編碼如下:

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) {}


查看完整回答
反對 回復 2019-07-26
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

正如@ dan-beaulieu建議我回答我自己的問題:

這是現在的工作代碼:

注意:代碼在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}


查看完整回答
反對 回復 2019-07-26
  • 3 回答
  • 0 關注
  • 1211 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號