微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

这是一个我定义的地方:
class Place: NSObject {

    var latitude: Double
    var longitude: Double

    init(lat: Double,lng: Double,name: String){
        self.latitude = lat
        self.longitude = lng
    }

    required init(coder aDecoder: NSCoder) {
        self.latitude = aDecoder.decodeDoubleForKey("latitude")
        self.longitude = aDecoder.decodeDoubleForKey("longitude")
    }

    func encodeWithCoder(aCoder: NSCoder!) {
        aCoder.encodeObject(latitude,forKey: "latitude")
        aCoder.encodeObject(longitude,forKey: "longitude")
    }

}

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

var placesArray = [Place]

//...

func savePlaces() {
    NSUserDefaults.standardUserDefaults().setobject(placesArray,forKey: "places")
    println("place saved")
}

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

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

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

第二版

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

func savePlaces(){
    let myData = NSKeyedArchiver.archivedDataWithRootObject(placesArray)
   NSUserDefaults.standardUserDefaults().setobject(myData,forKey: "places")
    println("place saved")
}

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

let placesData = NSUserDefaults.standardUserDefaults().objectForKey("places") as? NSData

 if placesData != nil {
      placesArray = NSKeyedUnarchiver.unarchiveObjectWithData(placesData!) as [Place]
 }

错误是:

[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实例.

例如:

func savePlaces(){
    let placesArray = [Place(lat: 123,lng: 123,name: "hi")]
    let placesData = NSKeyedArchiver.archivedDataWithRootObject(placesArray)
    NSUserDefaults.standardUserDefaults().setobject(placesData,forKey: "places")
}

func loadplaces(){
    let placesData = NSUserDefaults.standardUserDefaults().objectForKey("places") as? NSData

    if let placesData = placesData {
        let placesArray = NSKeyedUnarchiver.unarchiveObjectWithData(placesData) as? [Place]

        if let placesArray = placesArray {
            // do something…
        }

    }
}

原文地址:https://www.jb51.cc/iOS/336790.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐