表达式太复杂,迅速Xcode错误

时间:2018-08-15 22:28:55

标签: ios swift xcode cgrect

无法编译Xcode,出现此错误:

  

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

 self.locationButton.frame = CGRect(x: self.view.bounds.size.width/2 + buttonSize*1.4 - buttonSize/20 - buttonSize/2 , y: height/2 + (cardHeight+11)/2 - buttonSize/2, width: buttonSize/2, height: buttonSize/2)

2 个答案:

答案 0 :(得分:3)

这里有大量可能的类型和函数选择,只有其中一种是正确的。 Swift编译器现在还不够强大,无法快速决定是否要self.view.bounds.size.width/22视为整数,浮点数,CGFloat或Double。无法快速确定是否要使用CGRect.init的Integer,CGFloat或Double版本。它并不能很快知道您在+的多个版本中的哪个。有一天它会变得更好。如今,追逐组合爆炸性的可能性花了太长时间。因此,它要求您简化操作,以使计算该表达式不会花费几分钟(或更长时间)。

为简化起见,

let x: CGFloat = self.view.bounds.size.width/2 + buttonSize*1.4 - buttonSize/20 - buttonSize/2
let y: CGFloat = height/2 + (cardHeight+11)/2 - buttonSize/2
let width: CGFloat = buttonSize/2
let height: CGFloat = buttonSize/2
self.locationButton.frame = CGRect(x: x, y: y, width: width, height: height)

x的计算可能仍然太复杂,您可能想将其分解。

许多其他语言通过仅将所有内容提升为Double来解决该问题,该方法通常可以正常工作,但有时会引入难以调试的细微错误(例如,许多Int值不能表示为Double,您可以进入一个奇异的数学世界,其中x + 1 == x)。

Swift选择明确而谨慎地进行数字转换。那有一些好处。但是,这是权衡之一。

答案 1 :(得分:0)

是的,编译器说您的表达式要处理的很大,像这样分割您的表达式:

let locationButton = UIButton()
let xSize = CGFloat(100/33 + 43/22)
let ySize = CGFloat(2030/2 + 30/22)
locationButton.frame = CGRect(x: xSize, y: ySize, width: 200/2, height: 200/2)

CGFloat中的数字只是表达式的参考,随时使用您自己的值并尝试分析编译器的答案。 问候!