ios – 如何使用swift将一组对象保存到NSUserDefault?

前端之家收集整理的这篇文章主要介绍了ios – 如何使用swift将一组对象保存到NSUserDefault?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个我定义的地方:
  1. class Place: NSObject {
  2.  
  3. var latitude: Double
  4. var longitude: Double
  5.  
  6. init(lat: Double,lng: Double,name: String){
  7. self.latitude = lat
  8. self.longitude = lng
  9. }
  10.  
  11. required init(coder aDecoder: NSCoder) {
  12. self.latitude = aDecoder.decodeDoubleForKey("latitude")
  13. self.longitude = aDecoder.decodeDoubleForKey("longitude")
  14. }
  15.  
  16. func encodeWithCoder(aCoder: NSCoder!) {
  17. aCoder.encodeObject(latitude,forKey: "latitude")
  18. aCoder.encodeObject(longitude,forKey: "longitude")
  19. }
  20.  
  21. }

这是我如何保存一个地方数组:

  1. var placesArray = [Place]
  2.  
  3. //...
  4.  
  5. func savePlaces() {
  6. NSUserDefaults.standardUserDefaults().setObject(placesArray,forKey: "places")
  7. println("place saved")
  8. }

它没有工作,这是我在控制台上得到的:

  1. Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType')

我是iOS新手,可以帮我吗?

第二版

我找到了一个解决方案来保存数据:

  1. func savePlaces(){
  2. let myData = NSKeyedArchiver.archivedDataWithRootObject(placesArray)
  3. NSUserDefaults.standardUserDefaults().setObject(myData,forKey: "places")
  4. println("place saved")
  5. }

但是当使用此代码加载数据时,我收到错误

  1. let placesData = NSUserDefaults.standardUserDefaults().objectForKey("places") as? NSData
  2.  
  3. if placesData != nil {
  4. placesArray = NSKeyedUnarchiver.unarchiveObjectWithData(placesData!) as [Place]
  5. }

错误是:

  1. [NSKeyedUnarchiver decodeDoubleForKey:]: value for key (latitude) is not a double number'

我很确定我存档了一个Double,存在一个存储/加载过程的问题

任何线索?

解决方法

Property List Programming Guide

If a property-list object is a container (that is,an array or dictionary),all objects contained within it must also be property-list objects. If an array or dictionary contains objects that are not property-list objects,then you cannot save and restore the hierarchy of data using the varIoUs property-list methods and functions.

您将需要使用NSKeyedArchiver和NSKeyedUnarchiver将对象转换为NSData实例.

例如:

  1. func savePlaces(){
  2. let placesArray = [Place(lat: 123,lng: 123,name: "hi")]
  3. let placesData = NSKeyedArchiver.archivedDataWithRootObject(placesArray)
  4. NSUserDefaults.standardUserDefaults().setObject(placesData,forKey: "places")
  5. }
  6.  
  7. func loadPlaces(){
  8. let placesData = NSUserDefaults.standardUserDefaults().objectForKey("places") as? NSData
  9.  
  10. if let placesData = placesData {
  11. let placesArray = NSKeyedUnarchiver.unarchiveObjectWithData(placesData) as? [Place]
  12.  
  13. if let placesArray = placesArray {
  14. // do something…
  15. }
  16.  
  17. }
  18. }

猜你在找的iOS相关文章