当前位置: 首页 > 面试题库 >

如何快速将对象数组保存到NSUserDefault?

夏知
2023-03-14
问题内容

这是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

例如:

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…
        }

    }
}


 类似资料:
  • 问题内容: 我想将一个对象保存到文件中,然后轻松地从文件中读取它。作为一个简单的示例,可以说我有以下3d数组: 是否有一个简单的Ruby API,无需编程解析器即可解释文件中的数据,就可以用来实现此目的?在示例中,我给出了一个简单的例子,但是随着对象变得越来越复杂,使对象持久化变得很烦人。 问题答案: 参见元帅:http : //ruby- doc.org/core/classes/Marshal

  • 问题内容: 我需要创建一个数组来添加具有这种格式的对象,例如Swift中的字典:[“ key1”:“ value1”,“ key2”:“ value2”] 当我尝试全部保存时是正确的,但是使用键读取时会崩溃。var obj需要什么类型的数据? 问题答案: 这个问题的意思是“数组数组”,但是我想大多数人可能只是想知道如何将数组保存到。对于那些人,我将添加一些常见示例。 保存数组 检索数组 整数数组

  • 问题内容: 我刚刚在我的应用程序中创建了PDF文档,并且希望通过“文件”应用程序可以访问保存的文档的方式将文档保存在设备上。 当您在Safari中下载PDF文档时,可以选择将文档保存到“文件”应用中。 我用Google搜索了几个小时,但找不到任何有用的方法。 问题答案: 如果您有权访问,则可以向用户显示,然后将其保存到,或与其他任何可用选项共享该用户:

  • 问题内容: 通过从继承可以很容易地将Realm与类一起使用。但是我如何将包含几个字段的a保存到Swift中呢?例如 我知道文档中明确支持的类型。但是也许有一个不错的解决方法,或者甚至更好-来自领域的人可以写有关结构的未来计划。 问题答案: 我建议您使用协议,以实现所需的功能。 1)创建您的结构 2)创建您的领域对象 3)使用协议将我们的结构转换为Realm对象 4)使您的结构持久 有了这些工具,我

  • 问题内容: 我试图检查对象数组中是否存在特定项目(属性值),但找不到任何解决方案。请让我知道,我在这里想念的是什么。 问题答案: 您可以像这样过滤数组: 它将返回匹配闭包中指定条件的元素数组-在上述情况下,它将返回包含所有属性等于1的元素的数组。 由于您需要布尔结果,因此只需执行以下检查: 如果过滤后的数组至少包含一个元素,则为true

  • 问题内容: 我已经创建了一个JSON文件,并且需要能够通过电子邮件与其他协作者共享该文件。但是,尽管在R工作区中有许多处理JSON对象的主题,但实际上没有资源讨论如何实际将JSON对象导出到.JSON文件。 这是一个简单的例子: 最后一行,尝试读取JSON文件,导致错误:“ fromJSON(file =“ export.JSON”)中的错误:意外字符’R’” 显然,save()函数并不是可行的方