首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xcode-project不使用NSKeyedArchiver进行存档,但游乐场使用

Xcode-project不使用NSKeyedArchiver进行存档,但游乐场使用
EN

Stack Overflow用户
提问于 2017-03-02 19:23:33
回答 1查看 163关注 0票数 0

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

每次我打电话:

代码语言:javascript
复制
NSKeyedArchiver.archiveRootObject(person, toFile: "person")

它在游乐场中工作并返回true,但在项目中返回false。我不使用模拟器。

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

代码语言:javascript
复制
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")
} 
}

然后我创建一个人并将其存档。

代码语言:javascript
复制
let person = Person()
NSKeyedArchiver.archiveRootObject(person, toFile: "person")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-06 18:40:44

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

代码语言:javascript
复制
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中这样做只是为了测试,而且它成功了)给了它这样的路径:

代码语言:javascript
复制
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)")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42564177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档