Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 嵌套功能的好处是什么(一般/在Swift中)_Function_Swift_Conventions_Code Organization_Nested Function - Fatal编程技术网

Function 嵌套功能的好处是什么(一般/在Swift中)

Function 嵌套功能的好处是什么(一般/在Swift中),function,swift,conventions,code-organization,nested-function,Function,Swift,Conventions,Code Organization,Nested Function,我刚刚学习了一些Swift,我遇到了关于嵌套函数的部分: 函数可以嵌套。嵌套函数可以访问在外部函数中声明的变量。可以使用嵌套函数在长函数或复杂函数中组织代码 从 因此,如果所谓的好处是“组织代码”,为什么不在外部函数之外独立地使用嵌套函数呢?在我看来,这似乎更有条理 我能看到的唯一好处是“可以访问在外部函数中声明的变量”,但与嵌套函数的混乱相比,这似乎微不足道 有什么想法吗 因此,如果所谓的好处是“组织代码”,为什么不在外部函数之外独立地使用嵌套函数呢?在我看来,这似乎更有条理 哦,我完全不同意

我刚刚学习了一些Swift,我遇到了关于嵌套函数的部分:

函数可以嵌套。嵌套函数可以访问在外部函数中声明的变量。可以使用嵌套函数在长函数或复杂函数中组织代码

因此,如果所谓的好处是“组织代码”,为什么不在外部函数之外独立地使用嵌套函数呢?在我看来,这似乎更有条理

我能看到的唯一好处是“可以访问在外部函数中声明的变量”,但与嵌套函数的混乱相比,这似乎微不足道

有什么想法吗

因此,如果所谓的好处是“组织代码”,为什么不在外部函数之外独立地使用嵌套函数呢?在我看来,这似乎更有条理

哦,我完全不同意。如果需要第二个函数的唯一位置是在第一个函数内,那么将其保持在第一个函数内就更有条理了

现实生活中的例子如下:

另外,函数中的函数在作用域中具有本地环境。嵌套函数中的代码可以“查看”在嵌套函数声明之前声明的局部变量。这比传递一组参数更方便、更自然

但是,局部函数允许您以任何其他方式都无法轻松完成的关键事情是,您可以实时生成函数(因为函数是闭包)并从外部函数返回它


在我看来,闭包和嵌套函数的唯一区别是递归。您可以在函数体中引用函数本身,而无需技巧

func a() {
    func b() {
        b() // Infinite loop!
    }
    b()
}
捕获的引用类型对象在捕获器死亡时死亡。在本例中,capturer是函数的词法范围。这意味着函数在完成其执行时将死亡

从技术上讲,这是一个参考周期,通常是不鼓励的。但是如果你明智地使用它,这可能是有用的

例如,将其与异步操作相结合

func spawnAsyncOp1(_ completion: @escaping () -> Void) {
    enum Continuation {
        case start
        case waitForSomethingElse1
        case retry
        case end
    }
    let someResource = SomeResource()
    func step(_ c: Continuation) {
        switch c {
        case .start:
            return step(.waitForSomethingElse1)

        case .waitForSomethingElse1:
            DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(10), execute: {
                let fc = (someResource.makeRandomResult() % 100 < 50) ? .end : .retry as Continuation
                print("\(fc)")
                return step(fc)
            })

        case .retry:
            return step(.start)

        case .end:
            return completion()
        }
    }
    return step(.start)
}
func-spawnsyncop1(u-completion:@escaping()->Void){
枚举延续{
案例开始
案件等待处理1
案例重试
案例结束
}
让someResource=someResource()
func步骤(续){
开关c{
案例.开始:
返回步骤(.waitForSomethingElse1)
案例。waitForSomethingElse1:
DispatchQueue.main.asyncAfter(截止日期:.now()+.10毫秒),执行:{
让fc=(someResource.makeRandomResult()%100<50)?。结束:。作为继续重试
打印(“\(fc)”)
返回步骤(fc)
})
案例。重试:
返回步骤(.start)
案例.结束:
返回完成()
}
}
返回步骤(.start)
}

它可以在没有显式对象实例的情况下简化协同程序执行中的资源管理。资源仅在函数
spawasyncop1
中捕获,并在函数终止时释放

一件非常好的事情是,Xcode将在函数弹出窗口中缩进父函数中的嵌套函数。使用与重新计算缩进布局和在一个位置进行分组相关的功能,可以更轻松地导航功能弹出窗口


继续阅读,直到你读到函数一章,然后你会注意到它的好处:)嗯,这很简单。谢谢你强调这一点!(将在6分钟内标记正确答案)@matt我完全同意你的观点;我唯一关心的是函数体的大小以及父函数声明与其实际体之间的差距。假设我们在一个函数中有3-5个辅助函数(局部函数),它们需要在函数的顶部声明;因此,读者必须滚动许多行才能到达真实的身体;对于这种情况,你有什么建议?我们应该把这个函数提取为一个新类吗?@matt不,我想可能是我解释错了。示例的屏幕截图:。我关心的是父函数,这里是
convertToParams
,它的签名和它的实际主体之间的差距(
MARK:convertToParams body
),我非常喜欢打包函数,帮助函数在函数内部完成其工作;但是这个问题,你必须滚动从签名到实际的身体有点让我担心它的可读性。它可能需要更多的功能。你的建议是什么?