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

标签 swift nsuserdefaults sigabrt nscoding

我目前正在尝试将自定义 Swift 类保存到 NSUserDefaults。这是我的 Playground 中的代码:

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")

当我运行代码时,出现以下错误

Execution was interrupted, reason: signal SIGABRT.

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

在带有消息的应用程序中,相同的代码也会崩溃

"Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType')"

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

最佳答案

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

关于swift - 使用 NSCoding 将自定义 Swift 类保存到 UserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26469457/

相关文章:

ios - 如何解决可能出现意外的 Swift 警告 : "Constant ' value' inferred to have type 'AnyClass?' (aka 'Optional<AnyObject.Type>' ),?

ios - NSUserDefaults standardUserDefaults 对象被随机删除

ios - 如何防止我的设置(文件、NSUserdefaults)被 iExplorer 等外部应用程序修改

Swift SpriteKit : Thread 1: signal SIGABRT. 无法转换 SKLabelNode 类型的值?

ios - SWIFT: 'SecPolicy' 没有名为 'takeRetainedValue' 的成员

swift - 将内容与工作表顶部而不是中间对齐

objective-c - NSUserDefaults 可以用来读/写系统首选项 plist 吗?

iPhone 应用程序无法在模拟器上启动,没有错误

ios - 动态原型(prototype)单元未加载到模拟器中

swift - ScrollView + NavigationView 动画故障 SwiftUI