这是Place我定义的一个类:
Place
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") } }
这就是我尝试保存Places 数组的方式:
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,保存/加载过程存在问题
有什么线索吗?
从属性列表编程指南中:
如果属性列表对象是容器(即数组或字典),则其中包含的所有对象也必须是属性列表对象。如果数组或字典包含的对象不是属性列表对象,则无法使用各种属性列表方法和函数来保存和还原数据的层次结构。
您需要NSData使用NSKeyedArchiver和将对象与实例进行相互转换NSKeyedUnarchiver。
NSData
NSKeyedArchiver
NSKeyedUnarchiver
例如:
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… } } }