简体   繁体   English

NSUserDefaults返回空数组

[英]NSUserDefaults returns empty array

I have a class Person, which is a model 我有一个班级的人,这是一个模特

import Foundation

public class Person : NSObject , NSCoding{ 
public var name:String="";
public var gender:Int = 0;
public var status:Int = 0

    override init (){
        super.init()
    }

    public init (name:String, gender:Int){
    self.name=name;
    self.gender=gender;
}    
    required public init(coder aDecoder: NSCoder) {   }
    public func encodeWithCoder(_aCoder: NSCoder) {   }

}

Now when I try to retreive [Person] array I use method getPersons(arr : String!) . 现在,当我尝试检索[Person]数组时,我使用了getPersons(arr : String!) If there is no data in NSUserDefaults , I create it, put 1 element into it and store using setPersons() method. 如果NSUserDefaults中没有数据,我创建它,将1个元素放入其中并使用setPersons()方法存储。

The problem is that on retrieving I get an array with correct count (1), but the object is not filled, having "" in String and 0 in Int variables. 问题是,在检索时,我得到一个具有正确计数(1)的数组,但未填充对象,在String中具有“”,在Int变量中具有0。

 private func archivePeople (people : [Person]) -> NSData{
        return NSKeyedArchiver.archivedDataWithRootObject(people as NSArray)
    }

    public func getPersons(arr : String!) -> [Person]{
        var array : [Person] = []
        if let unarchivedObject = NSUserDefaults.standardUserDefaults().objectForKey(arr) as? NSData {
            array = (NSKeyedUnarchiver.unarchiveObjectWithData(unarchivedObject) as? [Person])!
        }

       if array.count == 0 {
            array.append(Person(name: A.DEFAULT_THEIR_NAMES,gender: 0))
            setPersons(arr, people: array)
        }
        return array
    }

    public func setPersons(key: String, people : [Person]){
         let archivedObject = archivePeople(people)
        userDefaults.setObject(archivedObject, forKey: key)
        userDefaults.synchronize()
    }

What is wrong? 怎么了? Do I set or retrieve this in a wrong way? 我是否以错误的方式设置或检索了这个?

You need to override properly the NSCoding functions. 您需要正确覆盖NSCoding函数。 It should look like something the code below: 它看起来应该像下面的代码:

 required public convenience init(coder aDecoder: NSCoder) {
        let name: String = aDecoder.decodeObject(forKey: "name") as! String
        let gender = aDecoder.decodeInt64(forKey: "gender")
        let status = aDecoder.decodeInt64(forKey: "status")
        self.init(name: name, gender: Int(gender))
        self.status = Int(status)
    }

    public func encodeWithCoder(_aCoder: NSCoder) {   
        _aCoder.encode(self.name, forKey: "name")
        _aCoder.encode(Int64(self.gender), forKey: "gender")
        _aCoder.encode(Int64(self.status), forKey: "status")
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM