我有一个函数,它向我返回一个值及其大小,可以在计算标签宽度上设置。满足某些条件后,我想停止递归函数的进一步过程,例如中断。
func getLength(value: Int, font: UIFont, viewFrame: CGRect) -> (width:CGFloat, text:String) {
let width: CGFloat!
var val = value
let size = String(format:"%d",value).size(attributes: [NSFontAttributeName: font])
if size.width+10 > viewFrame.size.width {
width = viewFrame.size.width-10
val = val/10
_ = getLength(value: val, font: font, viewFrame: viewFrame)
return (0.0 , "")
} else {
width = size.width+10
return (width,String(format:"%d+",val))
}
}
使用递归函数时,您应该在两个条件下返回值
func getLength(value: Int, font: UIFont, viewFrame: CGRect) -> (width:CGFloat, text:String) {
let width: CGFloat!
var val = value
let size = String(format:"%d",value).size(attributes: [NSFontAttributeName: font])
if size.width+10 > viewFrame.size.width {
width = viewFrame.size.width-10
val = val/10
return getLength(value: val, font: font, viewFrame: viewFrame)
} else {
width = size.width+10
return (width,String(format:"%d+",val))
}
}
只需在函数中返回一个值,而不是再次递归调用函数。这将停止递归,您将返回调用堆栈,并返回一个值。在您的情况下,递归看起来毫无意义,因为如果您的if
语句的计算结果为 true,您总是返回(0.0, "")
。