Swift Xcode项目没有';不能使用NSKeyedArchiver进行归档,但游乐场可以

Swift Xcode项目没有';不能使用NSKeyedArchiver进行归档,但游乐场可以,swift,xcode,swift3,swift-playground,Swift,Xcode,Swift3,Swift Playground,我在使用NSCoding和NSObject进行归档时遇到一些问题。这在操场上非常有效。但在Xcode中似乎不起作用。有人能帮我解决这个问题吗 每次我打电话: NSKeyedArchiver.archiveRootObject(person, toFile: "person") 它在游乐场工作并返回true,但在项目中返回false。我不使用模拟器 我一直在寻找相同类型的问题,但我似乎找不到任何与此相关的问题 class Person: NSObject, NSCoding { private

我在使用NSCoding和NSObject进行归档时遇到一些问题。这在操场上非常有效。但在Xcode中似乎不起作用。有人能帮我解决这个问题吗

每次我打电话:

NSKeyedArchiver.archiveRootObject(person, toFile: "person")
它在游乐场工作并返回true,但在项目中返回false。我不使用模拟器

我一直在寻找相同类型的问题,但我似乎找不到任何与此相关的问题

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类中对init进行一个小的编辑。删除
便利性
关键字并将
self.init()
替换为
super.init()

一旦你这样做了,你可以在任何你想要的地方调用archiver(我在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)")

您需要在Person类中对init进行一个小的编辑。删除
便利性
关键字并将
self.init()
替换为
super.init()

一旦你这样做了,你可以在任何你想要的地方调用archiver(我在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)")

看起来文件路径有问题。据我所知,游乐场实际上使用主目录,但项目将使用沙箱。如果使用类似于
FileManager.default.url的内容(用于:.documentDirectory,位于:.userDomainMask).first!。appendingPathComponent(“person”)
?我不确定FileManager是做什么的,但我是这样使用的:
让person=person()让path=FileManager.default.URL(用于:.documentDirectory,在:.userDomainMask.first中)!。appendingPathComponent(“person”)让PersonWasUpload:Bool=NSKeyedArchiver.archiveRootObject(person,toFile:“\(路径)”)打印(路径)打印(“person Upload:\(PersonWasUpload)”)
它创建如下文件:
file:///var/mobile/Containers/Data/Application/4843FF38-BEFD-47F0-A1E2-DE4ADDAAD97F/Documents/person
。但是,在应用程序和文档之间,数字/字母每次都会更改。您能帮我做些什么吗?看起来文件路径有问题。据我所知,游乐场实际上使用主目录,但项目将使用沙箱。如果使用类似于
FileManager.default.url的内容(用于:.documentDirectory,位于:.userDomainMask).first!。appendingPathComponent(“person”)
?我不确定FileManager是做什么的,但我是这样使用的:
让person=person()让path=FileManager.default.URL(用于:.documentDirectory,在:.userDomainMask.first中)!。appendingPathComponent(“person”)让PersonWasUpload:Bool=NSKeyedArchiver.archiveRootObject(person,toFile:“\(路径)”)打印(路径)打印(“person Upload:\(PersonWasUpload)”)
它创建如下文件:
file:///var/mobile/Containers/Data/Application/4843FF38-BEFD-47F0-A1E2-DE4ADDAAD97F/Documents/person
。然而,在应用程序和文档之间,数字/字母每次都会改变。这是您可以帮助我的吗?谢谢您的回答!我找到了一种不用FileManager的方法,就是不使用FileManager,并按照您的建议更改init()。我想主要的问题是如何初始化。谢谢你的回答!我找到了一种不用FileManager的方法,就是不使用FileManager,并按照您的建议更改init()。我想主要的问题是如何初始化。