嵌套函数在swift中的实际用途是什么?

Esq*_*uth 15 function swift

嵌套函数的实际用途是什么?它只会使代码更难阅读,并且不会使特定情况变得容易.

func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backwards ? stepBackward : stepForward
}
Run Code Online (Sandbox Code Playgroud)

资源

Hon*_*ney 21

我认为你的问题的核心是:为什么不使用私有函数而不是丑陋的嵌套函数?

简而言之,嵌套函数可以带来更多的可读性封装

仍然可以从类中的其他函数访问私有函数.嵌套函数也不是这样.你告诉你的开发人员,这只属于这个函数(与属于整个类的私有函数相反).退一步,不要乱用它,如果你需要类似的功能,那就去写吧!

另一个便利是它可以访问其父函数的所有本地参数.你不再需要传递它们.这最终意味着要测试一个较少的函数,因为你已经将一个函数包装在另一个函数中

另一个用例就是你班上的功能非常相似,比如你有:

extractAllHebrewNames() // right to left language
extractAllAmericanNames() // left to right language
extractAllJapaneseNames() // top to bottom language
Run Code Online (Sandbox Code Playgroud)

现在,如果您有一个名为printName的私有函数(打印名称),如果您根据语言切换案例,它将起作用,但如果您不/不能这样做会怎样.相反,您可以在每个单独的提取函数内编写自己的嵌套函数*并打印名称.

你的问题有点类似,为什么不使用'if else'而不是'Switch case.

我认为这只是一种便利(对于可以在不使用嵌套函数的情况下处理的东西).

注意:嵌套函数应该在函数内的callsite之前写入.

错误:在声明之前使用局部变量'nested'

func doSomething(){
    nested()

    func nested(){

    }
}
Run Code Online (Sandbox Code Playgroud)

没错误:

func doSomething(){
    func nested(){

    }

    nested()
}
Run Code Online (Sandbox Code Playgroud)

类似地,必须在嵌套函数之前声明嵌套函数中使用的局部变量


*:他们现在都可以拥有完全相同的名字.因为每个都在不同的命名空间.


Wil*_*aan -1

在您的示例中,您可以创建一个variable也是function这样的:

var myStepFunction = chooseStepFunction(true)

myStepFunction(4)
Run Code Online (Sandbox Code Playgroud)

嵌套函数的好处真是太好了。例如,假设您正在为计算器构建一个应用程序,您可以将所有逻辑放在一个函数中,如下所示:

func doOperation(operation: String) -> ((Double, Double) -> Double)? {
    func plus(s: Double, d: Double) -> Double {
        return s + d
    }
    func min(s: Double, d: Double) -> Double{
        return s - d
    }
    switch operation {
        case "+":
            return plus
    case "-" :
        return min
    default :
        return nil
    }
}

var myOperationFunction = doOperation("-")?(4, 4) // 0
var myOperationFunction2 = doOperation("+")?(4, 5) //9
Run Code Online (Sandbox Code Playgroud)

在某些情况下,您不被允许看到某些功能的实现,或者对其负责。然后将它们隐藏在其他函数中确实是一个好方法。例如,假设您的同事负责开发plusmin函数,他/她会这样做,而您只需使用外部函数。

它与闭包不同,因为在闭包中,将逻辑传递给其他逻辑,后者将调用您的逻辑。它是一种插件。例如,调用http请求后,您可以传递您希望应用程序在收到服务器响应时执行的代码

  • 为什么不直接使用私有函数呢?您的 func("+")?(4,5) 示例非常丑陋且难以阅读。这些都不是很好的实际用途,因为我认为通过其他方式可以更好地完成这项任务 (3认同)