【问题标题】:Nested functions error in swiftswift中的嵌套函数错误
【发布时间】:2023-09-21 05:09:01
【问题描述】:

我正在尝试在我的 Swift 程序中使用嵌套函数。

func test()->Bool{
    func test1()->Bool{
        return true
    }

    func test2()->Bool{
        return true
    }

    func test3()->Bool{
        return true
    }
    return test1 && test2 && test3
 }

它给了我一些错误!但是如果我尝试

return test1

它工作正常。

请解释为什么在嵌套函数中应用运算符时会出错。

【问题讨论】:

    标签: swift nested-function


    【解决方案1】:

    嵌套函数/闭包有两种方法:

    如你所愿:

    func test() -> Bool {
        func test1() -> Bool {
            return true
        }
    
        func test2() -> Bool {
            return true
        }
    
        func test3() -> Bool {
            return true
        }
        return test1() && test2() && test3()
    }
    

    或者将其保存到闭包中并调用它们:

    func test() -> Bool {
        let test1 = { () -> Bool in
            return true
        }
    
        let test2 = { () -> Bool in
            return true
        }
    
        let test3 = { () -> Bool in
            return true
        }
    
        return test1() && test2() && test3()
    }
    

    差异真的很小,这取决于您自己的喜好,但直接来自文档:

    嵌套函数是具有名称的闭包,可以从其封闭函数中捕获值。

    闭包表达式是用轻量级语法编写的未命名闭包,可以从周围的上下文中捕获值。

    无论哪种方式,这两种情况都必须在名称末尾使用() 调用才能执行它们的操作,否则您将返回一个函数而不是它的求值。您的 return test1 仅在这种情况下有效:

    func test() -> (() -> Bool) {
        func test1() -> Bool {
            return true
        }
    
        return test1
    }
    

    你的函数的返回类型是一个函数,它在你评估它之后返回Bool。您想要评估并返回结合逻辑 AND 语句的 Bool 值。因此,您必须评估每个函数以获取每个函数的 Bool 值以将其组合并返回最终值。

    【讨论】:

    • 感谢 Michal 如此详尽的回答!
    • @MinkeshJain 只是试图解释发生了什么,而不是盲目地提供修补程序:)
    • @MinkeshJain 不要忘记将帮助您的答案标记为已接受。如果您的问题尚未解决,请随时提问。
    【解决方案2】:

    return test1 也应该失败,除非你的类中有 test1 属性。您似乎只是忘记将它们称为函数。

    return test1() && test2() && test3() 会工作得很好。

    【讨论】: