使用嵌套函数快速清理代码

时间:2016-02-16 13:45:24

标签: swift coding-style nested-function

使用嵌套函数时,我对目前的代码风格不满意。

何时使用嵌套函数?

假设我有一个带有一个参数的函数。这个论点需要得到验证。我会用卫兵去做。现在,您可以使用较小的方法在方法中拆分任务。这样每个方法最多有n行。您可以将提取的方法设为私有,但这将是我需要的更大范围。因为这些方法仅在该方法中使用。我可以使用的最小范围是嵌套函数。

但在我看来,嵌套函数时代码会变脏。

以下示例显示了我当前的代码样式。

private func myFunction(iterationCount: Int) {
    func nestedOne() {

    }
    func nestedTwo(param: Int) {

    }
    guard iterationCount > 0 else {
        return
    }
    for i in 0 ..< iterationCount {
        nestedOne()
        nestedTwo(i)
    }
}

您对该代码风格有何看法?

修改

这是现实世界的例子。那应该是足够的信息。每个方法它只有几行代码。但是所有人都有很多代码。但是将它们设为私有将使它们可供课堂使用。并且这些方法永远不会被另一种方法使用。

private func rotateToPoint(newCenterPoint centerPoint: CGPoint, withDuration duration: Double) -> Bool {
    func createAnimation(/*n params here*/) -> CAKeyframeAnimation {
        let animation = CAKeyframeAnimation(keyPath: "position")
        // Create a CAKeyframeAnimation with the given path, duration etc.
        //
        //
        // Method has about this numer of lines.
        //
        //
        return animation
    }
    func createPathForRotation(/*n params here*/) -> UIBezierPath {
        let path = UIBezierPath()
        // Calculcate the path to move a view with an rotating second view.
        //
        //
        // Method has about this number of lines.
        //
        //
        //
        return path
    }
    func completionAction(/*n params here*/) {
        // Update state etc.
        //
        // Method has about this number of lines.
        //
        //
    }
    guard true /* check here */ else {
        return false
    }
    // Some variables and method calls here.
    //
    // Method has about this number of lines.
    //
    //
    //
    //
    return true
}

1 个答案:

答案 0 :(得分:0)

由于您的内部函数用于创建值,您可以使用闭包来初始化和设置变量/常量。

.slider-thumbs li{position: relative; }
.slider-thumbs a {vertical-align: top; display:block; word-break: break-word;}
.slider-thumbs a::after {
  content: '\A';
  position: absolute;
  width: 100%; 
  height:100%;
  top:0; 
  left:0;
  background:rgba(252,194,38,0.9);
  opacity: 0;
  transition: all 1s;
  -webkit-transition: all 1s;
}
.slider-thumbs a:hover::after, 
.slider-thumbs a.selected{
  opacity: 1;
}

现在你想要

  1. 在闭包内声明的变量/常量不是private func rotateToPoint(newCenterPoint centerPoint: CGPoint, withDuration duration: Double) -> Bool { guard true /* check here */ else { return false } let animation : CAKeyframeAnimation = { let animation = CAKeyframeAnimation(keyPath: "position") // set animation properties... return animation }() let path: UIBezierPath = { let path = UIBezierPath() // seth path properties return path }() let completion: (String)->() = { (word:String)->() in } // <- IMPORTANT! no parenthesis here // just use animation, path and completion return true }
  2. 可见的
  3. 使用闭包创建的变量/常量在rotateToPoint
  4. 之外是不可见的
  5. 恕我直言,代码更清洁