为什么在Swift中创建数组时会出错?

时间:2015-07-31 21:45:15

标签: arrays swift

在我的程序中,我有一个带有一些值的数组:

let pointArray = [
    [[185,350],8],
    [[248.142766340927,337.440122864078],5],
    [[301.67261889578,301.67261889578],5],
    [[337.440122864078,248.142766340927],5],
    [[350,185],8],
    [[327.371274561396,101.60083825503],5],
    [[301.67261889578,68.3273811042197],5],
    [[248.142766340927,32.5598771359224],5],
    [[185,20],8],
    [[101.60083825503,42.6287254386042],5],
    [[68.3273811042197,68.3273811042197],5],
    [[42.6287254386042,101.60083825503],5],
    [[20,185],8],
    [[32.5598771359224,248.142766340927],5],
    [[68.3273811042197,301.67261889578],8],
    [[101.60083825503,327.371274561396],5]
]

编译时出现以下错误:

  

表达太复杂,无法在合理的时间内解决;考虑   将表达式分解为不同的子表达式

为什么我收到错误?是因为数组太大了吗?

2 个答案:

答案 0 :(得分:3)

如果你给它一个大数组而不告诉它类型,Swift编译器通常不高兴。它必须解析所有数据以尝试推断类型。如果声明数组的类型,它将起作用:

let pointArray:[[Any]] = [[[185,350],8],[[248.142766340927, ...

但是,你必须强制阅读这些值。你应该考虑将你的值放入一个结构中,让数组保持这个。

对于您的数据,一组元组也可以很好地工作:

let pointArray:[(point: [Double], count: Int)] = [
    ([185,350],8),
    ([248.142766340927,337.440122864078],5),
    ([301.67261889578,301.67261889578],5)

]

let point = pointArray[0].point  // [185, 350]
let count = pointArray[0].count  // 8

答案 1 :(得分:1)

理论上它应该可以工作,但是表达式的复杂性有一个上限,IDE不会超过这一点,因此Swift编译器退出是故意的。并且因为类型没有被声明,即[[AnyObject]],如果你把你的代码放在一个操场上,它会旋转并旋转,你的粉丝将开始旋转,编译器将基本上退出。

Apple正致力于减少这些错误。在Apple Dev论坛上,他们要求人们将这些错误归档为雷达报告。