[巨大的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对象比其他没有此问题的对象小,编译器在“类型检查”过程中也需要太多时间。
直到现在,这是唯一的解决方法在要求的注释中将对象声明为单独的行:
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,我设法重现了'错误',但时间更长:
我相信Swift类型推断性能已得到改善,但无法针对非常复杂的类型推断类型。
您可能需要在其中分离嵌套词典:
AvroValue.avroRecordValue([
"key_a" : AvroValue.avroIntValue(int32),
...
])
到一个单独的值,例如let inner: [String: Int] = ["key_a": ...]
。
或者也许您可以从某些逻辑中生成值。如果它很大,则应考虑使用数据库(或将其保存为JSON格式的其他位置)并在使用它之前对其进行解码。
以上是关于[巨大的Dictionary对象时发生编译错误。分解表达式的主要内容,如果未能解决你的问题,请参考以下文章