Xcode-项目不使用 NSKeyedArchiver 存档,但 Playground 可以
Xcode-project doesn't archive using NSKeyedArchiver, but Playground does
我在使用 NSCoding 和 NSObject 进行归档时遇到了一些问题。这在 Playground 中工作得很好。但似乎在 Xcode 中不起作用。有人可以帮我解决这个问题吗?
每次我打电话:
NSKeyedArchiver.archiveRootObject(person, toFile: "person")
在 Playground 中有效,returns 正确,但在项目中 returns 错误。我不用模拟器。
我一直在寻找相同类型的问题,但似乎找不到与此相关的任何问题。
class Person: NSObject, NSCoding {
private var _name: String = "name"
private var _birthdate: Date = Date()
private var _income: Int = -1
private var _wealth: Int = -1
var name: String {
get { return _name }
set (newName) { _name = newName }
}
var birthdate: Date {
get { return _birthdate }
set (newBirthdate) { _birthdate = newBirthdate }
}
var income: Int {
get { return _income }
set (newIncome) { _income = newIncome }
}
var wealth: Int {
get { return _wealth }
set (newWealth) { _wealth = newWealth }
}
override init(){}
required convenience init(coder unarchiver: NSCoder) {
self.init()
if let name = unarchiver.decodeObject(forKey: "name") as? String {
self.name = name
}
if let birthdate = unarchiver.decodeObject(forKey: "birthdate") as? Date {
self.birthdate = birthdate
}
let income = unarchiver.decodeInteger(forKey: "income")
self.income = income
let wealth = unarchiver.decodeInteger(forKey: "wealth")
self.wealth = wealth
}
func encode(with archiver: NSCoder) {
archiver.encode(name, forKey: "name")
archiver.encode(birthdate, forKey: "birthdate")
archiver.encode(income, forKey: "income")
archiver.encode(wealth, forKey: "wealth")
}
}
然后我创建一个人并存档。
let person = Person()
NSKeyedArchiver.archiveRootObject(person, toFile: "person")
您需要对您的 Person class 中的 init 做一个小的编辑。删除 convenience
关键字并将 self.init()
替换为 super.init()
:
class Person: NSObject, NSCoding {
private var _name: String = "name"
private var _birthdate: Date = Date()
private var _income: Int = -1
private var _wealth: Int = -1
var name: String {
get { return _name }
set (newName) { _name = newName }
}
var birthdate: Date {
get { return _birthdate }
set (newBirthdate) { _birthdate = newBirthdate }
}
var income: Int {
get { return _income }
set (newIncome) { _income = newIncome }
}
var wealth: Int {
get { return _wealth }
set (newWealth) { _wealth = newWealth }
}
override init() {}
required init(coder unarchiver: NSCoder) {
super.init()
if let name = unarchiver.decodeObject(forKey: "name") as? String {
self.name = name
}
if let birthdate = unarchiver.decodeObject(forKey: "birthdate") as? Date {
self.birthdate = birthdate
}
let income = unarchiver.decodeInteger(forKey: "income")
self.income = income
let wealth = unarchiver.decodeInteger(forKey: "wealth")
self.wealth = wealth
}
func encode(with archiver: NSCoder) {
archiver.encode(name, forKey: "name")
archiver.encode(birthdate, forKey: "birthdate")
archiver.encode(income, forKey: "income")
archiver.encode(wealth, forKey: "wealth")
}
}
一旦你这样做了,你就可以在任何你想要的地方调用存档器(我在我的 viewDidLoad 中做了它只是为了测试并且它有效)给它一个这样的路径:
let person = Person()
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("person").path
let personWasUploaded: Bool = NSKeyedArchiver.archiveRootObject(person, toFile:path)
print(path)
print("person uploaded: \(personWasUploaded)")
我在使用 NSCoding 和 NSObject 进行归档时遇到了一些问题。这在 Playground 中工作得很好。但似乎在 Xcode 中不起作用。有人可以帮我解决这个问题吗?
每次我打电话:
NSKeyedArchiver.archiveRootObject(person, toFile: "person")
在 Playground 中有效,returns 正确,但在项目中 returns 错误。我不用模拟器。
我一直在寻找相同类型的问题,但似乎找不到与此相关的任何问题。
class Person: NSObject, NSCoding {
private var _name: String = "name"
private var _birthdate: Date = Date()
private var _income: Int = -1
private var _wealth: Int = -1
var name: String {
get { return _name }
set (newName) { _name = newName }
}
var birthdate: Date {
get { return _birthdate }
set (newBirthdate) { _birthdate = newBirthdate }
}
var income: Int {
get { return _income }
set (newIncome) { _income = newIncome }
}
var wealth: Int {
get { return _wealth }
set (newWealth) { _wealth = newWealth }
}
override init(){}
required convenience init(coder unarchiver: NSCoder) {
self.init()
if let name = unarchiver.decodeObject(forKey: "name") as? String {
self.name = name
}
if let birthdate = unarchiver.decodeObject(forKey: "birthdate") as? Date {
self.birthdate = birthdate
}
let income = unarchiver.decodeInteger(forKey: "income")
self.income = income
let wealth = unarchiver.decodeInteger(forKey: "wealth")
self.wealth = wealth
}
func encode(with archiver: NSCoder) {
archiver.encode(name, forKey: "name")
archiver.encode(birthdate, forKey: "birthdate")
archiver.encode(income, forKey: "income")
archiver.encode(wealth, forKey: "wealth")
}
}
然后我创建一个人并存档。
let person = Person()
NSKeyedArchiver.archiveRootObject(person, toFile: "person")
您需要对您的 Person class 中的 init 做一个小的编辑。删除 convenience
关键字并将 self.init()
替换为 super.init()
:
class Person: NSObject, NSCoding {
private var _name: String = "name"
private var _birthdate: Date = Date()
private var _income: Int = -1
private var _wealth: Int = -1
var name: String {
get { return _name }
set (newName) { _name = newName }
}
var birthdate: Date {
get { return _birthdate }
set (newBirthdate) { _birthdate = newBirthdate }
}
var income: Int {
get { return _income }
set (newIncome) { _income = newIncome }
}
var wealth: Int {
get { return _wealth }
set (newWealth) { _wealth = newWealth }
}
override init() {}
required init(coder unarchiver: NSCoder) {
super.init()
if let name = unarchiver.decodeObject(forKey: "name") as? String {
self.name = name
}
if let birthdate = unarchiver.decodeObject(forKey: "birthdate") as? Date {
self.birthdate = birthdate
}
let income = unarchiver.decodeInteger(forKey: "income")
self.income = income
let wealth = unarchiver.decodeInteger(forKey: "wealth")
self.wealth = wealth
}
func encode(with archiver: NSCoder) {
archiver.encode(name, forKey: "name")
archiver.encode(birthdate, forKey: "birthdate")
archiver.encode(income, forKey: "income")
archiver.encode(wealth, forKey: "wealth")
}
}
一旦你这样做了,你就可以在任何你想要的地方调用存档器(我在我的 viewDidLoad 中做了它只是为了测试并且它有效)给它一个这样的路径:
let person = Person()
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("person").path
let personWasUploaded: Bool = NSKeyedArchiver.archiveRootObject(person, toFile:path)
print(path)
print("person uploaded: \(personWasUploaded)")