使用嵌套函数时,我对目前的代码风格不满意。
何时使用嵌套函数?
假设我有一个带有一个参数的函数。这个论点需要得到验证。我会用卫兵去做。现在,您可以使用较小的方法在方法中拆分任务。这样每个方法最多有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
}
答案 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;
}
现在你想要
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
}
rotateToPoint