Xcode中的数组文字导致构建时间过长

4

我有一个SwiftUI/SpriteKit游戏,每个等级都由数组字面量中的元组属性描述。到目前为止,已经有大约150个元组,每个元组包含大约20个属性。

问题在于,这个大数组字面量导致Xcode构建非常缓慢。构建我的项目需要5分钟以上的时间。如果我屏蔽掉数组,构建时间几乎是瞬间完成的。

我认为这是由于类型推断 -- 但是,我明确设置了类型,就像这样:

class MainData: ObservableObject {
    private var levels: [(firstKey: Int, secondKey: String)] = [
        (
           firstKey: 0,
           secondKey: "something"
        ),
        (
           firstKey: 0,
           secondKey: "something"
        )
    ]
}

我做错了什么吗?有没有办法可以优化这个数组以加快构建时间?

谢谢!

更新:在添加了更多元组后,Xcode实际上会停止响应,并且我的(全新的台式机)Mac将耗尽应用程序内存。


1
你可以尝试将这个部分移到一个专门的模块中,这将保持应用程序其余部分的构建时间快速(直到您再次操作游戏数据): https://github.com/fastred/Optimizing-Swift-Build-Times#modularization - odlp
2
先试一下,但我相信它与类型检查器有关。似乎对于 Swift 编译器来说,检查 [SomeStruct] 比检查 [(Int, String)] 更容易,特别是当元组变得更大时,可能存在一个大 O 问题,即元组中的字段越多,解决方法就越多... - Shadowrun
1
将json文件放入您的应用程序包中:https://www.hackingwithswift.com/example-code/system/how-to-decode-json-from-your-app-bundle-the-easy-way 添加文件到包中,例如:https://dev59.com/tlYO5IYBdhLWcg3wKemM - Shadowrun
1
Swift存在性能问题,并且在一段时间内仍将存在。您可能会对此帖子感兴趣 https://forums.swift.org/t/compile-performance-with-large-constant-arrays-crash-quadratic-behaviour/18143 请考虑在Swift错误跟踪器中提交您的情况。 - paiv
1
尝试添加类型别名,例如 "typealias LongListOfTypes = (Int,String,Int,String)"。 - Sardorbek Ruzmatov
显示剩余6条评论
1个回答

0

最终,我只是将数组文字的每个不同部分提取到自己的属性中,这些新属性是索引协调的。游戏级别是这些属性的索引。

因此,这个:

    private var levels: [(firstKey: Int, secondKey: String)] = [
        (
           firstKey: 0,
           secondKey: "something"
        ),
        (
           firstKey: 0,
           secondKey: "something"
        )
    ]

...变成了这样:

    private let firstKey: [Int] = [
        0,
        0, //Level 1
        0  //Level 2
    ]
    private let secondKey: [String] = [
        "",
        "something", //Level 1
        "something"  //Level 2
    ]

如果您的原始数组字面量很大,这将是一项耗时繁琐的任务——但它确实可以将构建时间降回正常水平。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接