gpt4 book ai didi

带有嵌套函数的 Swift 简洁代码

转载 作者:可可西里 更新时间:2023-10-31 23:44:14 24 4
gpt4 key购买 nike

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

什么时候使用嵌套函数?

假设我有一个带有一个参数的函数。该论点需要验证。我会用守卫来保护它。现在您可以将方法内的任务拆分为更小的方法。这样每个方法最多有n行。您可以将提取的方法设为私有(private),但这会比我需要的范围更大。因为这些方法仅在该方法内使用。我可以使用的最小范围是嵌套函数。

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

下面的例子展示了我目前的代码风格。

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)将使类可以访问它们。并且这些方法永远不会被其他方法使用。

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
}

最佳答案

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

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
}

如你所愿

  1. 在闭包内声明的变量/常量对 rotateToPoint 不可见
  2. 使用闭包创建的变量/常量在 rotateToPoint 之外不可见
  3. 恕我直言,代码更简洁

关于带有嵌套函数的 Swift 简洁代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com