2017-05-08 3 views
0

私は計算上のラベルの幅に設定できる値とそのサイズを返す関数を持っています。一定の条件を満たした後、私はのような再帰関数のさらなる手続きを中止したいと思います。。再帰関数を使用する場合はSwiftで特定の条件が満たされたときに再帰的メソッドを終了する方法はありますか?

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)) 
    } 
} 

答えて

2

あなただけではなく、再帰的にもう一度関数を呼び出すよりも、関数内で値を返す条件

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)) 
     } 
    } 
1

の両方に値を返す必要があります。それは再帰を止め、コールスタックを返し、値を返します。あなたの場合、ifステートメントがtrueと評価された場合、常に(0.0, "")を返すので、再帰は無意味に見えます。

関連する問題