【问题标题】:"Expression was too complex" initializing a Set from an Array literal“表达式太复杂”从数组文字初始化 Set
【发布时间】:2018-07-17 08:53:38
【问题描述】:

我在这里阅读了一堆关于 “表达式太复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式” 错误的问题,它们归结为重载运算符(尤其是 +)和类型推断需要很长时间才能编译。答案通常是确实将有问题的表达式分解成碎片或明确使用类型。我的问题似乎有所不同。

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

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      大型文字在 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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        • 2021-06-03
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        相关资源
        最近更新 更多