在 Swift 中将数组保存到文件

Alm*_*ini 3 arrays json dictionary ios swift

我正在构建一个应用程序,它将:

  1. 检查互联网连接;
  2. 如果服务器可达,则从服务器接收 JSON 文件并将数据存储在文件中;
  3. 如果与服务器的连接断开,则从文件中读取。

现在我设法实现了连接检查、接收 JSON、将数据放入数组。

接收到的 JSON 如下所示:

在此处输入图片说明

然后我使用以下代码创建一个字典数组来存储 JSON 数据。选择字典数组是为了能够对其进行过滤,然后使用值的键来获取值。

var rates = [ExchangeRates]()  //instance of class Rate
var bnkDct  =  ["bank": "", "currency": "","buyrate": "", "sellrate": ""] //template
var indx : Int = 0 //index for iteration

            for rate in jsonData{
                let rate = ExchangeRates(data: rate as! NSDictionary)

                rates.append(rate)

                    bnkDct["bank"] = rates[indx].bank
                    bnkDct["buyrate"] = rates[indx].buyRate
                    bnkDct["sellrate"] = rates[indx].sellRate
                    bnkDct["currency"] = rates[indx].currency

                self.bankDict.append(bnkDct)
                indx += 1
            }
Run Code Online (Sandbox Code Playgroud)

在此之后,我有一个如下所示的数组:

在此处输入图片说明

现在我想将这个数组保存到一个文件中,显然能够读取它。

我试图用这样的东西写数据:

        let filePath = NSTemporaryDirectory() + "MyData.dat"

        self.bankDict.writeToFile(filePath, automatically: true)
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误:“[(Dictionary)] 没有 writeToFile 成员”。

此外,我无法将其转换为 NSDictionary 以使用相同的writeToFile方法。

我也试图用这样的东西写数据:

        let filePath = NSTemporaryDirectory() + "MyData.dat"

        NSKeyedArchiver.archiveRootObject(self.bankDict, toFile: filePath)
Run Code Online (Sandbox Code Playgroud)

它创建了一个带有奇怪编码的文件:

在此处输入图片说明

当我试图阅读它时:

 let newDictionary = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Dictionary <String,AnyObject> ]
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:“致命错误:在展开可选值时意外发现 nil”

调试器还显示了非常“有趣”的事情:

在此处输入图片说明

newDictionary 变量有无数个值。数组中有 40 个字典被写入文件。

任何人都可以建议我在这里做错了什么,或者我在这里使用了不好的做法?

Dun*_*n C 5

除非对象图中的每个对象都是属性列表对象,否则不能使用数组或字典 writeToFile 方法。(一个小的类型列表。查找它。)

您的数组中有一个自定义类 ExchangeRates。

同样,除非对象图中的每个对象都符合 NSCoding 协议,否则您无法使用 NSKeyedArchiver 保存文件。如果您向 ExchangeRates 类添加对 NSCoding 的支持,那么您的第二种方法将起作用,但文件内容将不是人类可读的。