我的问题:编译器无法在合理的时间内对这个表达式进行类型检查。

时间:2020-04-21 15:54:41

标签: ios swift

我有代码:

#FIELD1#

enter image description here

我的错误:

编译器无法在合理的时间内对这个表达式进行类型检查;尝试将表达式分成不同的子表达式

我读到,如果Swift遇到的可能性非常多,以至于大约15秒后根本无法弄清,它就会抛出错误:“表达太复杂,无法在合理的时间内解决;考虑将表达式分成不同的子表达式。”

我知道我需要将我的代码“分为”两部分,以便该错误“消失”。 我不知道如何破解密码

1 个答案:

答案 0 :(得分:2)

尽管由于类型检查此表达式所需的时间而导致的问题是编译器错误,但这实际上是您最少的后顾之忧。

这样的代码:

let newOrigin = CGPoint(x: (frame.size.width - width) / 2 + width + downArrow.width / 2, y: height / 2 - downArrow.height / 2)

现在,也许明天,也许在几周后,可能对您有意义。但这对其他人没有任何意义,包括未来1年。为什么要减去呢?为什么要除以2?然后再添加些什么?

您应该将此表达式分解为命名的子表达式,以表达您要执行的操作的意图。我真的不能为您做到这一点,因为我完全不知道这些计算试图达到什么目的。

这是一个开始:

func updateArrowPosition() {
    let width = text!.size(withAttributes: [
      NSAttributedString.Key.font: defaultFont as Any
    ]).width

    let newOriginX = (frame.size.width - width) / 2 + width + downArrow.width / 2 // What the fuck?
    let newOriginY = height / 2 - downArrow.height / 2
    downArrow.origin = CGPoint(x: newOriginX, y: newOriginY)

    downArrow?.isHidden = 1 < LibManager.shared().location.sublocations.count
}

我建议您进一步分解newOrigin(X/Y),并解释所有这些算术术语的作用。

进一步:

  1. 不要将条件运算符用于如此长的表达式。很难读。只需使用if / else。在这种情况下,您甚至可以进一步简化,根本不需要分支。
  2. 我不建议编写扩展名UIView.height()
    1. 那应该是一个计算属性,而不是无参数函数。
    2. frame.size.height已经有直接的CGRect成员时,没有理由使用height: CGFloat。只需使用frame.height
    3. 目前尚不清楚这是frame还是bound的高度。到将其重命名为frameHeight时,您可能还刚刚使用了frame.height