首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将带有NSCoding的自定义Swift类保存到UserDefaults

将带有NSCoding的自定义Swift类保存到UserDefaults
EN

Stack Overflow用户
提问于 2014-10-20 23:33:26
回答 13查看 58.3K关注 0票数 81

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

代码语言:javascript
复制
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")

当我运行代码时,我得到以下错误

执行中断,原因:信号信号。

在最后一行(ud.setObject...)

在应用程序中显示消息时,相同的代码也会崩溃

“格式为200的属性列表无效(属性列表不能包含‘CFType’类型的对象)”

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

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2015-10-31 00:52:05

正如@dan-beaulieu建议我回答自己的问题:

以下是现在的工作代码:

注意:对于在游乐场中工作的代码来说,类名称的分离是不必要的。

代码语言:javascript
复制
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
}
票数 21
EN

Stack Overflow用户

发布于 2018-03-28 03:40:50

在Swift 4或更高版本中,请使用

在您的示例中,使用以下代码。

代码语言:javascript
复制
class Blog: Codable {
   var blogName: String?
}

现在创建它的对象。例如:

代码语言:javascript
复制
var blog = Blog()
blog.blogName = "My Blog"

现在将其编码为:

代码语言:javascript
复制
if let encoded = try? JSONEncoder().encode(blog) {
    UserDefaults.standard.set(encoded, forKey: "blog")
}

然后像这样解码:

代码语言:javascript
复制
if let blogData = UserDefaults.standard.data(forKey: "blog"),
    let blog = try? JSONDecoder().decode(Blog.self, from: blogData) {
}
票数 64
EN

Stack Overflow用户

发布于 2014-10-21 00:52:04

第一个问题是你必须确保你有一个没有损坏的类名:

代码语言:javascript
复制
@objc(Blog)
class Blog : NSObject, NSCoding {

然后,您必须将对象编码(到NSData中),然后才能将其存储到用户默认值中:

代码语言:javascript
复制
ud.setObject(NSKeyedArchiver.archivedDataWithRootObject(blog), forKey: "blog")

类似地,要恢复对象,您需要将其解压缩:

代码语言:javascript
复制
if let data = ud.objectForKey("blog") as? NSData {
    let unarc = NSKeyedUnarchiver(forReadingWithData: data)
    unarc.setClass(Blog.self, forClassName: "Blog")
    let blog = unarc.decodeObjectForKey("root")
}

请注意,如果你不是在操场上使用它,它会更简单,因为你不需要手动注册这个类:

代码语言:javascript
复制
if let data = ud.objectForKey("blog") as? NSData {
    let blog = NSKeyedUnarchiver.unarchiveObjectWithData(data)
}
票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26469457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档