我在Playground中使用Swift 3,Xcode 8.0拥有此功能:
import Foundation
class Person: NSObject, NSCoding {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
required convenience init(coder aDecoder: NSCoder) {
let name = aDecoder.decodeObject(forKey: "name") as! String
let age = aDecoder.decodeObject(forKey: "age") as! Int
self.init(
name: name,
age: age
)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
aCoder.encode(age, forKey: "age")
}
}
创建人员数组
let newPerson = Person(name: "Joe", age: 10)
var people = [Person]()
people.append(newPerson)
编码数组
let encodedData = NSKeyedArchiver.archivedData(withRootObject: people)
print("encodedData: \(encodedData))")
保存到用户默认值
let userDefaults: UserDefaults = UserDefaults.standard()
userDefaults.set(encodedData, forKey: "people")
userDefaults.synchronize()
检查
print("saved object: \(userDefaults.object(forKey: "people"))")
从userDefaults返回
if let data = userDefaults.object(forKey: "people") {
let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: data as! Data)
print("myPeopleList: \(myPeopleList)")
}else{
print("There is an issue")
}
只需检查存档的数据
if let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: encodedData){
print("myPeopleList: \(myPeopleList)")
}else{
print("There is an issue")
}
我无法正确将数据对象保存到userDefaults,此外,底部的检查还会产生错误“严重错误:在展开可选值时意外发现nil”。“检查”行还显示已保存的对象为nil。这是我对象的NSCoder中的错误吗?
斯威夫特4注意
您可以再次在Playground中保存/测试您的值
迅捷3
UserDefaults需要在真实项目中进行测试。注意:无需强制同步。如果要在运动场中测试编码/解码,则可以使用键控存档器将数据保存到文档目录中的plist文件中。您还需要修复班级中的一些问题:
class Person: NSObject, NSCoding {
let name: String
let age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
required init(coder decoder: NSCoder) {
self.name = decoder.decodeObject(forKey: "name") as? String ?? ""
self.age = decoder.decodeInteger(forKey: "age")
}
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(age, forKey: "age")
}
}
测试:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// setting a value for a key
let newPerson = Person(name: "Joe", age: 10)
var people = [Person]()
people.append(newPerson)
let encodedData = NSKeyedArchiver.archivedData(withRootObject: people)
UserDefaults.standard.set(encodedData, forKey: "people")
// retrieving a value for a key
if let data = UserDefaults.standard.data(forKey: "people"),
let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Person] {
myPeopleList.forEach({print( $0.name, $0.age)}) // Joe 10
} else {
print("There is an issue")
}
}
}
问题内容: 我目前正在尝试将自定义Swift类保存到NSUserDefaults。这是我的游乐场代码: 运行代码时,出现以下错误 执行被中断,原因:信号SIGABRT。 在最后一行(…) 在带有消息的应用程序中,相同的代码也会崩溃 “属性列表对于格式无效:200(属性列表不能包含’CFType’类型的对象)” 有人可以帮忙吗?我在Maverick上使用Xcode 6.0.1。谢谢。 问题答案: 正
我正在尝试将我的实时数据库调整为一个聊天应用程序的云firestore。存储的对象是我创建的Message类。我希望邮件成为文档。 我的RecyclerView适配器将使用实时数据库这样检索它们: 下面是我如何开始用Firestore重新创建它的。如何在快照侦听器的OneEvent方法中将快照转换回消息?
我试图从Firebase Firestore中检索一个字段,并将其放入一个自定义对象中。我成功地从代码上传了自定义对象,没有任何问题,但是当我试图从Firestore读取和访问对象列表时,我一直得到以下错误: SelfMadeQuestion类如下所示: 这就是我试图做的,以便从Firebase中读取自拍问题列表: 由于可以将自定义对象上载到firebase并且工作正常,我想知道是否有任何方法可以
问题内容: 嗨,我正在尝试将EditText小部件值保存在手机/平板电脑的内部存储器中,以便应用程序关闭或活动停止时可以自动检索它们。所有这些都可以使用保存按钮来完成。(窗口小部件的值由用户输入)。 问题答案: 您应该使用共享首选项,共享首选项用于在需要访问数据时将其存储在本地应用程序中。使用此链接https://www.journaldev.com/9412/android- shared-pr
问题内容: 我有一个新闻和一个消息。所述含有选择加入到阵列时teamObjects的的tableView。我想将此数组添加到其中,以便可以从其中包含需要teamObjects的url请求的访问它们。但是我不断得到: “试图为关键团队插入非财产列表对象(“”) 如果有比将其存储在更好的方法,我愿意接受其他建议 方法 我的对象 问题答案: 实际上,您将需要将自定义对象归档到其中,然后将其保存到用户默认
问题内容: 我正在尝试将Redis会话集成到用Node.js编写的身份验证系统中。 我已经能够成功设置Redis服务器和Express服务器。 这是我的设置(只是重要的一点): 现在…我该如何实际创建,阅读和销毁会话?我已经阅读了很多关于如何设置的文章以及关于SO的许多问题,但是我发誓每个都只停留在配置上,并且不解释如何实际使用它… 我知道这可能非常简单,但是请不要投票,而只是解释一下:)。 问题