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

时间:2017-07-20 15:44:44

标签: swift xcode

我收到此错误,我不知道如何解决! 我正在搜索所有解决方案,但无法解决它!

  

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

修改:

    func createTarget(id: Int) {

        listdata = dbHelpr.getDatabase(rowId: id)

        for data in listdata {

            let lengthOfChar : CGFloat = data.ans.length
            let yAxis : CGFloat = self.view.frame.height / 2 + 70

            var width: CGFloat = view.frame.size.width - 40 // frame width
            var targetWidth: CGFloat = (width - (lengthOfChar - 1) * 5) / lengthOfChar
            var totalWidth: CGFloat = (targetWidth * lengthOfChar) + ((lengthOfChar - 1) * 5)

            if targetWidth > 50 {
                targetWidth = 50
            }

            for tar in data.ans.characters {


                var xAxis : CGFloat = (width / 2) - (totalWidth / 2) + (tar * targetWidth) + (tar * 5) + 20

                let targetLabel = UILabel(frame: CGRect(x: xAxis, y: yAxis, width: targetWidth, height: 5.0))
                targetLabel.backgroundColor = .white
                targetLabel.layer.masksToBounds = true
                targetLabel.layer.cornerRadius = 5
                targetLabel.text = String(describing: tar)
                targetLabel.textAlignment = .center
                targetLabel.textColor = .white
                self.view.addSubview(targetLabel)

            }

        }

    }

3 个答案:

答案 0 :(得分:6)

  

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

如上所述,打破它:

let preAxis1: GCFloat = (width / 2) - (totalWidth / 2) 
let preAxis2: GCFloat = (tar * targetWidth) + (tar * 5) + 20
let xAxis : CGFloat = preAxis1 + preAxis2

现在,这揭示了另一个(真正的)问题,而你正在做的事情没有意义:

  

二进制运算符'*'不能应用于'Character'类型的操作数   和'CGFloat'

所以tarCharacter,而不是“数字”。 在xAxis的计算中使用它没有任何意义。你想要的实际上是它的索引。

而不是for tar in data.ans.characters {,你可以这样做:

for (indexTar, tar) in data.ans.characters.enumerated() {

您正在迭代characters中的所有data.ansindexTar是当前索引,tarCharacter。 因此,在先前的tar计算中将indexTar替换为xAxis,这更有意义并且应该有效。

答案 1 :(得分:0)

这通常发生在表达式的子元素不具有应该的类型时。检查widthtotalWidthtartargetWidth是否也是CGFloat

如果不是,请将它们投放到CGFloat

let xAxis : CGFloat = (CGFloat(width) / 2) - (CGFloat(totalWidth) / 2) + (CGFloat(tar) * CGFloat(targetWidth)) + (CGFloat(tar) * 5) + 20

答案 2 :(得分:0)

问题在于你使用的基本算术运算符有很多重载,因此类型推断需要很长时间才能使编译器完成,所以你应该将每个值转换为CGFloat或将表达式分解为几个线。

将表达式分成几行:

var xAxis : CGFloat = (width / 2) - (totalWidth / 2)
xAxis += (tar*targetWidth)
xAxis += (tar*5) + 20

转换为CGFloat:

let xAxis : CGFloat = (CGFloat(width) / CGFloat(2)) - (CGFloat(totalWidth) / CGFloat(2)) + (CGFloat(tar) * CGFloat(targetWidth)) + (CGFloat(tar) * 5) + CGFloat(20)