【问题标题】:Save an array to file in Swift将数组保存到 Swift 中的文件
【发布时间】:2015-12-11 13:36:27
【问题描述】:

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

  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
            }

在这之后我有一个看起来像这样的数组:

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

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

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

        self.bankDict.writeToFile(filePath, automatically: true)

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

我也不能将其转换为 NSDictionary 以使用相同的 writeToFile 方法。

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

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

        NSKeyedArchiver.archiveRootObject(self.bankDict, toFile: filePath)

它会创建一个编码奇怪的文件:

当我试图阅读它时:

 let newDictionary = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Dictionary <String,AnyObject> ]

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

调试器也显示了非常“有趣”的东西:

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

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

【问题讨论】:

  • 我认为你应该看看 Core Data。这是一个很好的开始链接:raywenderlich.com/85578/first-core-data-app-using-swift
  • 去掉类型转换as! [Dictionary &lt;String,AnyObject&gt; ],看看值是什么。
  • 我的猜测是您在应用程序启动之间丢失了保存的文件,因为每次应用程序启动时NSTemporaryDirectory 路径都会更改。解决方案是将其保存到永久位置。至于newDictionary 及其无数项,这只是调试器吓坏了,因为如果在变量声明之后但在填充之前停止,它无法找到实际的变量内容。我敢打赌这个变量实际上是空的。
  • @EricD。感谢您的回复,但它似乎很好地找到了文件。我正在使用函数: func getFileURL(fileName: String) -> NSURL { let manager = NSFileManager.defaultManager() let dirURL = manager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, properForURL: nil, create: false, error: nil ) return dirURL!.URLByAppendingPathComponent(fileName) } let filePath = getFileURL("MyData.dat").path!我试图比较它们匹配的文件路径。
  • @Adam 当我删除类型转换时它向我显示警告。如果我运行应用程序,它使用 AnyObject?类型和值为零

标签: ios arrays json swift dictionary


【解决方案1】:

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

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

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

【讨论】:

  • 你能解释一下我应该如何使用 NSCoding 吗?
  • 介绍 NSCoding 的完美链接。感谢您添加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2015-05-30
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
相关资源
最近更新 更多