当前位置: 首页 > 面试题库 >

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

卫松
2023-03-14
问题内容

我目前正在尝试将自定义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。谢谢。


问题答案:

正如@ 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
}


 类似资料:
  • 问题内容: 我正在制作一个使用AVFoundation拍照的应用程序,我想将它们保存到自定义相册中,然后查询并显示在我的应用程序中。(除非用户希望,否则我不希望它们出现在一般的照片胶卷中)我真的找不到任何东西可以显示在Swift中如何做到这一点……或根本没有。我应该有其他方法吗? 我在SO上找到了这个示例,但是对我来说这没有意义,我无法使其正常工作。 任何帮助/说明都将非常棒! 问题答案: 这是我

  • 问题内容: 我有一个新闻和一个消息。所述含有选择加入到阵列时teamObjects的的tableView。我想将此数组添加到其中,以便可以从其中包含需要teamObjects的url请求的访问它们。但是我不断得到: “试图为关键团队插入非财产列表对象(“”) 如果有比将其存储在更好的方法,我愿意接受其他建议 方法 我的对象 问题答案: 实际上,您将需要将自定义对象归档到其中,然后将其保存到用户默认

  • 自定义缓存类使用说明 phpGrace 1.2.1 版本新增了自定义缓存类的功能,您可以将某个相同类型的缓存封装为一个类文件,便于项目的复用 (: 实现步骤 在 phpGrace/caches/ 文件夹下创建您的自定义缓存类文件 文件命名规则 : 缓存类名称.php 类命名规则 : class 缓存类名称 extends \cacheBase{} 使用命名空间 : namespace phpG

  • 我正试图将一个值从一个定制钩子(为服务器获取数据)保存到带有useState的功能组件状态,因为我以后需要更改这个值,更改后需要重新加载。因此,理想的行为是: 将状态变量设置为自定义挂钩中的值 我尝试的是: > 设置useState的初始值到我的钩子:

  • 问题内容: 我在Playground中使用Swift 3,Xcode 8.0拥有此功能: 创建人员数组 编码数组 保存到用户默认值 检查 从userDefaults返回 只需检查存档的数据 我无法正确将数据对象保存到userDefaults,此外,底部的检查还会产生错误“严重错误:在展开可选值时意外发现nil”。“检查”行还显示已保存的对象为nil。这是我对象的NSCoder中的错误吗? 问题答案

  • 我有一个自定义帖子类型的站点设置来定义主页调用操作框。 标题、描述和特色图像都由edtior的默认块/功能处理,但我正在尝试添加一个自定义块以将url保存到帖子的元。 块正确呈现,但它没有保存元数据,显然调用了< code>updateBlockValue函数。 我使用了几乎相同的代码为页面和帖子创建自定义元块。此方法是否不适用于自定义帖子类型? 这是我正在使用的代码: 服务器端编程语言(Prof