从数组文字初始化Set的“表达式太复杂”

时间:2018-07-17 08:53:39

标签: ios swift

我在这里阅读了许多有关“表达式太复杂而无法在合理的时间内解决;请考虑将表达式分解为不同的子表达式” 的错误,它们会归结为重载运算符(尤其是+)和类型推断需要很长时间才能编译。答案通常是确实将令人讨厌的表达式分解为多个片段,或者将其显式地包含在类型中。我的问题似乎有所不同。

let someSet: Set<String> = [
    "aardvark",
    "aardvarks",
    "abaci",
    "aback",
// ... 81,000 more words ...
    "zygote",
    "zygotes",
    "zygotic",
    "zymurgies",
    "zymurgy",
]

我想在编译时而不是在运行时预填充Set,以节省加载时间,而且这似乎是一种将大量数据输入我的应用程序的简单方法。在出现上述错误之前,该文件将编译10分钟(使用3个进程使用100%CPU)。我看不到任何表达式可以分解,并且我对类型很明确。有建议吗?

2 个答案:

答案 0 :(得分:2)

将单词放入JSON文件中,并在应用启动时将其导入到集合中。

答案 1 :(得分:1)

大字面量在Swift中并不起作用。如果您想要这么大的文字,则需要将其存储在文件中并读取。在这种情况下,我建议使用JSON格式。

创建一个名为myData.json或其他名称的json文件并编写文字:

[
    "aardvark",
    "aardvarks",
    "abaci",
    "aback",
// ... 81,000 more words ...
    "zygote",
    "zygotes",
    "zygotic",
    "zymurgies",
    "zymurgy"
]

幸运的是,JSON数组语法与Swift数组文字几乎相同!

现在您可以像这样读取文件:

if let path = Bundle.main.url(forResource: "myData", withExtension: "json"), let data = try? Data(contentsOf: path) {
    let decoder = JSONDecoder()
    if let stringArray = try? decoder.decode([String].self, from: data) {
        let someSet = Set(stringArray)
    }
}