我目前正在尝试将自定义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")
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我收到以下错误
执行被中断,原因:信号SIGABRT.
在最后一行(ud.setObject...)
在带有消息的应用程序中,相同的代码也会崩溃
"属性列表格式无效:200(属性列表不能包含'CFType'类型的对象)"
有人可以帮忙吗?我在Maverick上使用Xcode 6.0.1.谢谢.
我已将我的项目迁移到Swift 3并且NSKeyedArchiver无法正常工作.我在尝试解码这样的对象时实际上有一个运行时错误:
let startDayTime = aDecoder.decodeObject(forKey: Key.startDayTime) as! Int
Run Code Online (Sandbox Code Playgroud)
它在Xcode 7.3中的Swift 2.2中完美运行.还有其他人遇到过这样的麻烦吗?
PS我在模拟器和设备上都有这个错误.
更新:我通过使用decodeInteger(forKey key: String)而不是来解决这个问题decodeObject(forKey key: String).由于某种原因,AnyObject不会在Swift 3中转换为Integer,尽管它在Swift 2.2中也是如此
我有一个名为的自定义类Person,它在输入信息时存储有关某人的各种属性.
class Person {
// Person dictionary variable
var name: String?
var age: String?
var html_url: String?
init(json: NSDictionary) { // Dictionary object
self.name = json["name"] as? String
self.age = json["age"] as? String
self.html_url = json["html_url"] as? String // Location of the JSON file
}
}
Run Code Online (Sandbox Code Playgroud)
创建字典后,将其放入数组中.NSUserDefaults当点击按钮时,我在将阵列保存时遇到问题.
personArray.append(newPerson) // newPerson = dictionary of attributes
NSUserDefaults.standardUserDefaults().setObject(personArray, forKey: "personArray")
NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)
我已经看过如何在NSUserDefaults中存储自定义对象和使用NSCoding将自定义SWIFT类保存到UserDefaults但是我没有运气并且发现它很难理解.
当我只是尝试保存到NSUserDefaults时,我被告知以下内容:
Attempt to set a non-property-list object (
"PersonApp.Person"
) as an NSUserDefaults/CFPreferences …Run Code Online (Sandbox Code Playgroud) 我的自定义对象符合NSCoding协议,具有以下方法
required init(coder decoder: NSCoder) {
super.init()
createdDate = decoder.decodeObject(forKey: "created_date") as? Date
userId = decoder.decodeInteger(forKey: "user_id")
}
func encode(with aCoder: NSCoder) {
aCoder.encode(createdDate, forKey: "created_date")
aCoder.encode(userId, forKey: "user_id")
}
Run Code Online (Sandbox Code Playgroud)
这是Swift 3中nscoding协议的正确方法名称,但应用程序因错误而崩溃 SwiftValue encodeWithCoder - unrecognized selector sent to instance
显然这种方法不可用,为什么不被认可?
参考https://developer.apple.com/reference/foundation/nscoding
这是我制作的归档方法
func encodeObject(_ defaults:UserDefaults, object:NSCoding?, key:String) {
if (object != nil) {
let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object)
defaults.set(encodedObject, forKey: key)
} else {
defaults.removeObject(forKey: key)
}
}
Run Code Online (Sandbox Code Playgroud)