【问题标题】:Array too long with swift 3 and too complex to be solvedswift 3的数组太长而且太复杂而无法解决
【发布时间】:2016-10-27 22:42:04
【问题描述】:

我的代码在 Swift 2.2 上运行良好,但在转换为 Swift 3 之后,我输入了一个包含 41 个值(并非全部显示在那里)的数组,就像编译器拒绝的变量一样。我收到一条错误消息,告诉我“表达式太复杂,无法在合理的时间内解决,请考虑将表达式分解为不同的子表达式”。

let staticPos = [CGPoint(x:523,y:409),CGPoint(x:723,y:407),CGPoint(x:922,y:401),
CGPoint(x:1122,y:409),CGPoint(x:1335,y:401),CGPoint(x:1542,y:409),
CGPoint(x:523,y:496),CGPoint(x:726,y:504),CGPoint(x:922,y:489),
CGPoint(x:1132,y:497),CGPoint(x:1355,y:489),CGPoint(x:1552,y:505),
CGPoint(x:514,y:587),CGPoint(x:705,y:595),CGPoint(x:910,y:587),
CGPoint(x:1122,y:595),CGPoint(x:1345,y:587),CGPoint(x:1551,y:603), CGPoint(x:524,y:698),
CGPoint(x:724,y:689),CGPoint(x:922,y:690),
CGPoint(x:1122,y:706),CGPoint(x:1345,y:690),CGPoint(x:1551,y:706)]

如何在我的数组中输入所有这些值以便编译器接受它们?

谢谢,

【问题讨论】:

  • 如何创建单独的 CGPoints,然后将它们添加到数组中,例如 [p1, p2, p3, p4...pn] where p1=CGPointMake(x:523,y=409)
  • @vadian 的解决方案很好(这是问题的核心;CGPoint 重载太多,编译器会感到困惑),但我也会打开雷达(bugreport.apple.com ) 来提出这个问题。

标签: arrays swift


【解决方案1】:

另一种解决方案是创建一个元组数组,然后将它们映射到[CGPoint]。使用闭包进行初始化确保代码只运行一次。

let staticPos : [CGPoint] = {
  let positions = [(523,409),(723,407),(922,401),(1122,409),(1335,401),(1542,409),(523,496),
                   (726,504),(922,489),(1132,497),(1355,489),(1552,505),(514,587),(705,595),
                   (910,587),(1122,595),(1345,587),(1551,603),(524,698),(724,689),(922,690),
                   (1122,706),(1345,690),(1551,706)]
  return positions.map{ CGPoint(x:$0.0, y:$0.1) }

}()

【讨论】:

【解决方案2】:

在 Xcode 8.0 和 Xcode 8.1 GM 种子中测试,编译:

let staticPos: [CGPoint] = [CGPoint(x:523,y:409),CGPoint(x:723,y:407),CGPoint(x:922,y:401),
                 CGPoint(x:1122,y:409),CGPoint(x:1335,y:401),CGPoint(x:1542,y:409),
                 CGPoint(x:523,y:496),CGPoint(x:726,y:504),CGPoint(x:922,y:489),
                 CGPoint(x:1132,y:497),CGPoint(x:1355,y:489),CGPoint(x:1552,y:505),
                 CGPoint(x:514,y:587),CGPoint(x:705,y:595),CGPoint(x:910,y:587),
                 CGPoint(x:1122,y:595),CGPoint(x:1345,y:587),CGPoint(x:1551,y:603), CGPoint(x:524,y:698),
                 CGPoint(x:724,y:689),CGPoint(x:922,y:690),
                 CGPoint(x:1122,y:706),CGPoint(x:1345,y:690),CGPoint(x:1551,y:706)]

还有这个:

let staticPos1 = [
    (523,409),(723,407),(922,401),(1122,409),(1335,401),(1542,409),(523,496),
    (726,504),(922,489),(1132,497),(1355,489),(1552,505),(514,587),(705,595),
    (910,587),(1122,595),(1345,587),(1551,603),(524,698),(724,689),(922,690),
    (1122,706),(1345,690),(1551,706)
    ].map(CGPoint.init(x:y:))

【讨论】:

  • 谢谢大家! OOPer 提供的解决方案效果很好,让我能够在几分钟内成功编译我的代码。添加的事实很奇怪:[CGPoint] 纠正问题,因为表达式仍然像以前一样复杂,但它有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多