我收到此错误,我不知道如何解决! 我正在搜索所有解决方案,但无法解决它!
表达太复杂,无法在合理的时间内解决;考虑 将表达式分解为不同的子表达式
修改:
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)
}
}
}
答案 0 :(得分:6)
表达太复杂,无法在合理的时间内解决;考虑 将表达式分解为不同的子表达式
如上所述,打破它:
let preAxis1: GCFloat = (width / 2) - (totalWidth / 2)
let preAxis2: GCFloat = (tar * targetWidth) + (tar * 5) + 20
let xAxis : CGFloat = preAxis1 + preAxis2
现在,这揭示了另一个(真正的)问题,而你正在做的事情没有意义:
二进制运算符'*'不能应用于'Character'类型的操作数 和'CGFloat'
所以tar
是Character
,而不是“数字”。
在xAxis
的计算中使用它没有任何意义。你想要的实际上是它的索引。
而不是for tar in data.ans.characters {
,你可以这样做:
for (indexTar, tar) in data.ans.characters.enumerated() {
您正在迭代characters
中的所有data.ans
,indexTar
是当前索引,tar
是Character
。
因此,在先前的tar
计算中将indexTar
替换为xAxis
,这更有意义并且应该有效。
答案 1 :(得分:0)
这通常发生在表达式的子元素不具有应该的类型时。检查width
,totalWidth
,tar
和targetWidth
是否也是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)