[巨大的Dictionary对象时发生编译错误。分解表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[巨大的Dictionary对象时发生编译错误。分解表达式相关的知识,希望对你有一定的参考价值。

我正在项目中创建一个巨大的Dictionary对象(大约300个键),一切正常,直到出现新的编译错误。

“编译器无法在合理的时间对该类型进行类型检查;请尝试将该表达式分解为不同的子表达式”

我做了警报提示,然后将字典分成两部分,然后分成三部分,现在分成四部分,但是仍然存在愚蠢的编译错误。

当Dictionary是250个键时,该错误并不存在,但现在甚至包含30行的Dictionary对象也是如此,所以是的,我不知道如何解决此问题。另外,这使我觉得这可能是个错误。

let returnThing_2: [String:AvroValue] = [
            "record_xx" : AvroValue.avroRecordValue([
                "key_a" : AvroValue.avroIntValue(int32),
                "key_b" : AvroValue.avroIntValue(int32),
                "key_c" : AvroValue.avroIntValue(int32),
                "key_d" : AvroValue.avroIntValue(int32),
                "key_e" : AvroValue.avroIntValue(int32),
                 etc...

AvroValue."Whatever" = AvroValue。在这种情况下,什么是AvroValue根本不相关,因为已定义Dictionary对象以将其保存为“ [String:AvroValue]”。

这可以正常工作,但是有时候,即使Dictionary对象比其他没有此问题的对象小,编译器在“类型检查”过程中也需要太多时间。

enter image description here

直到现在,这是唯一的解决方法在要求的注释中将对象声明为单独的行:

let dicti: [String:AvroValue] = [
    "key_a" : AvroValue.avroIntValue(int32),
        "key_b" : AvroValue.avroIntValue(int32),
        "key_c" : AvroValue.avroIntValue(int32),
        "key_d" : AvroValue.avroIntValue(int32),
        "key_e" : AvroValue.avroIntValue(int32),
         etc...
        ])
]

然后,我将dicti添加到avroRecordValue:

let recordValue: AvroValue = AvroValue.avroRecordValue(dicti)

最后:

let returnThing_2: [String:AvroValue] = [ "record_xx" : recordValue]
答案

基于this blog post,我设法重现了'错误',但时间更长:

enter image description here

我相信Swift类型推断性能已得到改善,但无法针对非常复杂的类型推断类型。

您可能需要在其中分离嵌套词典:

AvroValue.avroRecordValue([
  "key_a" : AvroValue.avroIntValue(int32),
  ...
])

到一个单独的值,例如let inner: [String: Int] = ["key_a": ...]

或者也许您可以从某些逻辑中生成值。如果它很大,则应考虑使用数据库(或将其保存为JSON格式的其他位置)并在使用它之前对其进行解码。

以上是关于[巨大的Dictionary对象时发生编译错误。分解表达式的主要内容,如果未能解决你的问题,请参考以下文章

java中异常分哪些种类:

为啥 Swift Dictionary 不可桥接?

如果键不存在,C# Dictionary<int, int> 查找会发生啥?

Python面向对象-异常

巨大的 initializer_list 编译分段错误

Java“常量字符串太长”编译错误。仅在使用 Ant 时发生,在使用 Eclipse 时不会发生