【问题标题】:How to save any class in NSUserDefaults [duplicate]如何在 NSUserDefaults 中保存任何类 [重复]
【发布时间】:2016-05-06 19:52:25
【问题描述】:

我尝试了几种不同的方法来将此类保存在 NSUserDefaults 中。我不知道如何使用覆盖功能保存类。我怎样才能做到?

class CountryEntity: AnyObject {
private(set) var id: UInt = 0
private(set) var name = ""

override func cityData(data: Dictionary<String, AnyObject>!) {
    id = data.uint(key: "id")
    name = data.string(key: "name")
}

}

我试过这样,但它对我没有帮助

  private static var _selectedCountryEntity: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(countryNameKey) {
    didSet {
        let savedData = NSKeyedArchiver.archivedDataWithRootObject(selectedCountryEntity as! NSData)

        NSUserDefaults.standardUserDefaults().setObject(savedData, forKey: countryNameKey)
        NSUserDefaults.standardUserDefaults().synchronize()
    }
}

static var selectedCountryEntity: AnyObject? {
    get {
        return _selectedCountryEntity
    }


      set {
//            if newValue != _selectedCountryTuple {
                _selectedCountryEntity = newValue
//            }
        }
    }

【问题讨论】:

  • 为什么不将每个单独的部分存储在一个数组中,并制作序列化/反序列化方法(take a look at this

标签: ios swift nsuserdefaults


【解决方案1】:

要在 NSUserDefaults 中存储自定义类,数据类型需要是 NSObject 的子类,并且应该遵守 NSCoding 协议。

1) 为您的数据创建自定义类

class CustomData: NSObject, NSCoding {
let name : String
let url : String
let desc : String

init(tuple : (String,String,String)){
    self.name = tuple.0
    self.url = tuple.1
    self.desc = tuple.2
}
func getName() -> String {
    return name
}
func getURL() -> String{
    return url
}
func getDescription() -> String {
    return desc
}
func getTuple() -> (String,String,String) {
    return (self.name,self.url,self.desc)
}

required init(coder aDecoder: NSCoder) {
    self.name = aDecoder.decodeObjectForKey("name") as! String
    self.url = aDecoder.decodeObjectForKey("url") as! String
    self.desc = aDecoder.decodeObjectForKey("desc") as! String
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.name, forKey: "name")
    aCoder.encodeObject(self.url, forKey: "url")
    aCoder.encodeObject(self.desc, forKey: "desc")
} 
}

2) 使用以下函数保存数据:

func saveData()
    {
        let data  = NSKeyedArchiver.archivedDataWithRootObject(custom)
        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(data, forKey:"customArray" )
    }

3) 检索:

if let data = NSUserDefaults().dataForKey("customArray"),
custom = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [CustomData] {
// Do something with retrieved data
    for item in custom {
    print(item)
    }
}

注意:这里我保存和检索一组自定义类对象。

【讨论】:

  • 请在我的问题更新中显示我写了我如何尝试使用 NSKeyedArchiver 保存它
  • @Ankit Goel NSUserDefaults 有一个名为 dataForKey if let data = NSUserDefaults().dataForKey("customArray") { ... } 不需要强制转换的方法
  • 我将编辑答案。此方法将其保存在 UserDefaults 本身中,但也使用了 NSKeyedArchiver。
  • 不要使用 as!,在条件 let 中添加第二行并使用 as? custom = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [CustomData]
  • customData 它是一个类。你应该以大写字母开始命名它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多