使用Swift存储大型多维数组的最佳方法是什么?
我有一个4D整数数组,似乎已经放慢了Xcode 8.2中的编译速度,现在大约有200组9个整数(总共1800个)。第一个数组由12个数组组成,每个数组有8个数组,然后每个数组有2个或更多数组,每个数组由9个整数组成。事情是我计划将数据量增加5或6倍。
昨晚我无法编译我的应用程序,它今天早上终于工作了,但它仍然很慢。我认为当我添加到数组时问题会变得更糟。
有人说只是将每个数组附加到viewDidLoad中,有些人提到为txt文件加载数组但我不知道该怎么做。
答案 0 :(得分:3)
我很抱歉继续制作同一个笑话,但你需要像超人一样穿着裤子这样做:一次一条腿。从整体结构开始。然后继续制作最里面的数组并将它们附加到外部数组中以构建最外层的数组。这将帮助您入门:
var level1 : [[[[Int]]]] = []
var level2 : [[[Int]]] = []
var level3 : [[Int]] = []
// -----
level3 = []
let innermost1 = [1,2,3,4,5,6,7,8,9]
let innermost2 = [11,12,13,14,15,16,17,18,19]
level3.append(innermost1)
level3.append(innermost2)
level2.append(level3)
level1.append(level2)
// ... keep going ...
通过这种方式,我们永远不需要任何大/深的数组文字,项目将很容易编译。
另请注意,每个级别的数组类型都是显式声明的。这使得Swift比推断它更快乐。
答案 1 :(得分:0)
我喜欢亚光的一条腿,但另一种方法是将它全部放在一个文件中并在启动时加载文件。方法如下:
创建您的文件。 JSON可能会做到这一点
[
[
[
[ 1, 2, 3, 4 ... ],
[ ... ],
// etc
我们假设它被称为data.json
。您需要通过将其添加到副本包资源构建阶段来确保它在您的应用程序包中。
在启动附近的某处,您需要从捆绑包中检索文件。我在一个在bundle中定义的类(应用程序委托将很好地完成)中这样做:
let myBundle = Bundle(for: type(of: self))
guard let fileUrl = myBundle.url(forResource: "data", withExtension: "json")
else
{
// it's missing, bail out
}
guard let data = try? Data(contentsOf: fileUrl)
else
{
// can't read it bail
}
guard let arrays = try? jSONSerialization.jsonObject(with: data)
else
{
// invalid JSON, bail
}
此时,您有一个基础数组的嵌套结构,其中包含您想要的数据。您可能希望将它们转换为Swift数组,具体取决于您希望它们的用途。