首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在应用程序终止之前存储(持久化)结构数组的最有效方法是什么?

在应用程序终止之前存储(持久化)结构数组的最有效方法是什么?
EN

Stack Overflow用户
提问于 2014-07-09 08:23:16
回答 2查看 904关注 0票数 4

编程语言-- swift。

我已经创建了一个结构来存储与我的应用程序相关的所有信息,如下所示。此外,我正在创建一个类型为wordstruct的数组,并用来自3000个条目填充它。

代码语言:javascript
运行
复制
struct wordStruct{
    var wordd:NSString
    var meaning: [NSString]
    var sentance: String
    var syn: [String]
    var seen:Int
    var set: Int
    var HF: Int
}

在尝试了我能想到的多种方法之后,我还不能存储(持久化)数据(即结构数组)。我也尝试过NSUserDefault、Plist和NSCoding方法(我可能做错了什么)。存储结构数组的最有效方法是什么?将数组写到文件中可以吗?

EN

Stack Overflow用户

发布于 2015-05-04 05:27:06

结构不能符合NSCoding,因为NSCoding是一个类协议。如果您想使用NSCoding来持久化您的模型(这通常是最直接的方法),那么您必须将您的模型重新声明为符合NSCoding的NSObject。

下面是一个示例,说明如何根据您提供的代码片段实现它:

代码语言:javascript
运行
复制
class Word: NSObject, NSCoding {

    var word: NSString!
    var meaning: [NSString]!
    var sentence: String!
    var syn: [String]!
    var seen:Int!
    var set: Int!
    var HF: Int!
    // specify how your model will be decoded:
    required convenience init(coder decoder: NSCoder) {
        self.init()
        self.word = decoder.decodeObjectForKey("word") as! String
        self.meaning = decoder.decodeObjectForKey("meaning") as! [String]
        self.sentence = decoder.decodeObjectForKey("sentence") as! String
        self.syn = decoder.decodeObjectForKey("syn") as! [String]
        self.seen = decoder.decodeIntegerForKey("seen")
        self.set = decoder.decodeIntegerForKey("set")
        self.HF = decoder.decodeIntegerForKey("HF")
    }
    // specify how your model will be encoded
    func encodeWithCoder(coder: NSCoder) {
        coder.encodeObject(word, forKey: "word")
        coder.encodeObject(meaning, forKey: "meaning")
        coder.encodeObject(sentence, forKey: "sentence")
        coder.encodeObject(syn, forKey: "syn")
        coder.encodeInteger(seen, forKey: "seen")
        coder.encodeInteger(set, forKey: "set")
        coder.encodeInteger(HF, forKey: "HF")
    }
}

// an example word:
let example = Word()
example.word = "example"
example.meaning = ["abstractions", "generalizations", "use cases"]
example.sentence = "here is how you can implement NSCoding"
example.syn = ["what", "is", "a", "syn"]
example.seen = 1
example.set = 2
example.HF = 3

// persist the example to NSUserDefaults
let data = NSKeyedArchiver.archivedDataWithRootObject(example)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "example")

// load the saved example from NSUserDefaults 
if let data = NSUserDefaults.standardUserDefaults().objectForKey("example") as? NSData {
    if let example = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Word {
        example.meaning // ["abstractions", "generalizations", "use cases"]
        example.set // 2
        example.seen // 1
        example.word // "example"
    }
}

对于进一步的阅读,Matt Thompson在这里有一个关于这个主题的很好的帖子:http://nshipster.com/nscoding/

阅读官方文档也没什么坏处:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/index.html

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24643609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档