【问题标题】:Compiling large array literal in Xcode 8.2在 Xcode 8.2 中编译大型数组文字
【发布时间】:2017-03-13 16:42:09
【问题描述】:

用 Swift 存储大型多维数组的最佳方法是什么?

我有一个 4D 整数数组,它似乎已经减慢了 Xcode 8.2 中的编译速度,因为它大约有 200 组 9 个整数(总共 1800 个)。第一个数组由 12 个数组组成,然后每个数组有 8 个数组,然后每个数组有 2 个或更多数组,每个数组由 9 个整数组成。问题是我计划可能将数据量增加 5 或 6 倍。

昨晚我无法编译我的应用程序,今天早上它终于可以工作了,但它仍然很慢。我认为当我添加到数组时问题会变得更糟。

有些人说只在 viewDidLoad 中附加每个数组,有些人提到为 txt 文件加载数组,但我不知道该怎么做。

【问题讨论】:

  • "有些人说只在 viewDidLoad 中附加每个数组,有些人提到为 txt 文件加载数组,但我不知道该怎么做"嗯,其中之一就是你需要做。遗憾的是 Swift 在大/深数组字面量方面遇到了麻烦,但事实就是如此。
  • 另外,你没有显示任何代码真的非常令人震惊。
  • 好吧,考虑一下。如果我能看到这个文字 是什么以及你如何声明它,我可以为你编写更智能的代码,包括展示如何将它表示为文件并加载它。所以,隐藏细节不是犯罪,但如果你想要的是真正的帮助,那就是弄巧成拙了。

标签: ios arrays swift xcode multidimensional-array


【解决方案1】:

我很抱歉一直在开同样的玩笑,但你需要像超人穿裤子一样做这件事:一次一条腿。从整体结构开始。然后继续制作最里面的数组并将它们附加到外部数组中以构建最外面的数组。这将使您开始:

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 比不得不推断要快乐得多。

【讨论】:

  • 这是一个漫长的过程,但我想如果它有效,它会有效
  • 我认为一旦你制定了模式,一切都不会那么糟糕。您已经输入了巨大的文字,因此一些灵巧的查找和替换会将其转换为一系列命令。
  • 这可能会让我在更新应用程序时更容易(在视觉上)添加数据
【解决方案2】:

我喜欢 matt 一次一条腿的方法,但另一种方法是将它全部放在一个文件中并在启动时加载该文件。方法如下:

创建您的文件。 JSON 可能会解决问题

[
    [
        [
            [ 1, 2, 3, 4 ... ],
            [ ... ],

// etc

假设它被称为data.json。您需要通过将其添加到复制包资源构建阶段来确保它在您的应用程序包中。

在启动附近的某个地方,您需要从包中检索文件。我在包中定义的类中执行此操作(应用程序委托会做得很好),如下所示:

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 数组,具体取决于您想要它们的用途。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2015-09-27
    • 2011-11-16
    相关资源
    最近更新 更多