ios - NSUserDefaults 返回空数组

标签 ios swift nsuserdefaults

我有一个类Person,它是一个模型

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) {   }

}

现在,当我尝试检索 [Person] 数组时,我使用方法 getPersons(arr : String!) 。如果 NSUserDefaults 中没有数据,我会创建它,将 1 个元素放入其中并使用 setPersons() 方法进行存储。

问题是在检索时我得到一个计数正确的数组 (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()
    }

怎么了?我是否以错误的方式设置或检索它?

最佳答案

您需要正确覆盖 NSCoding 函数。 它应该类似于下面的代码:

 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")
    }

关于ios - NSUserDefaults 返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301292/

相关文章:

ios - swift 结构体作为函数参数

javascript - 从 iOS UIWebView 更新 React 组件中元素的值

ios - 在swift 4中将对象数组中的选定项目保存到UserDefaults

swift - 为什么 SwiftUI Limited `@ViewBuilder` 参数计数为 10?

ios - NSuserDefaults直到我关闭应用程序迅速才保存

ios - 如何保存和重用整数

ios - 如何实现 NSUserDefault 通过多个 View 访问

ios - 有没有办法在另一个推送到达时提前停止推送通知声音?

java - Android/IOS app与网关(后端服务器)之间数据传输框架

ios - 在推送过渡期间响应导航栏高度变化