闭包函数和函数的区别

Lic*_*tia 2 swift

我正在尝试快速学习并且遇到了闭包问题,但我仍然有一个问题要问,在互联网上找不到任何答案,我不确定在这里提问是否合适,但我真的需要对此的回答。

说我们有以下课程

class Human{
var gender:String?

 private func fCheckGender(pGender:String?){
    guard pGender != nil else {
        print("Gender not specified")
        return
    }

    if pGender == "M"{
        print("Male")
    }
    else if pGender == "F"{
        print("Female")
    }
    else{
        print("gender Unknown")
    }
}

private func cCheckGender( pGender:@autoclosure ()->(String?)){

    guard pGender() != nil else {
        print("Gender not specified")
        return
    }

    if pGender() == "M"{
        print("Male")
    }
    else if pGender() == "F"{
        print("Female")
    }
    else{
        print("gender Unknown")
    }
}

func  MyCheckGender(){

    fCheckGender(pGender: gender)
    cCheckGender(pGender: gender)
}
Run Code Online (Sandbox Code Playgroud)

}

var myHuman:Human = Human()

myHuman.gender = "M"

myHuman.MyCheckGender()
Run Code Online (Sandbox Code Playgroud)

我想知道两者的区别

fCheckGender 和 cCheckGender 我应该何时何地使用闭包

提前致谢!

PS 我故意使用了 void->String()->(String?) 我只想了解这种情况下的区别。我很抱歉我的英语不好

use*_*037 5

关闭:

  • 闭包是一个代码块,把它当作一个未命名的函数。
  • 当闭包作为参数传递时,在函数内部的代码调用该参数之前,不会评估该闭包。

自动关闭:

  • 自动闭包只是一个将参数值与其一起打包的闭包。
  • 当您定义自动闭包时,闭包将没有参数。

fCheckGender和之间的区别cCheckGender

  • fCheckGender将一个String 作为参数。
  • cCheckGender 将闭包作为参数。
  • cCheckGender被调用时,闭包被传递了一个参数,此时闭包只作为参数传递,闭包并没有被执行。只有在函数内部使用闭包参数时,闭包才会被执行。

您所陈述的示例可能不是展示差异的最佳示例。

让我们考虑一个不同的例子:

例子:

func add(a: Int, b: Int) -> Int {

    print("add")

    return a + b
}

func f1(pValue: Int) {

    print("f1")

    print("value = \(pValue)")
}

func f2(pClosure: (Int, Int) -> Int, pA: Int, pB: Int) {

    print("f2")

    let value = pClosure(pA, pB)

    print("value = \(value)")
}

//In autoclosure the closure always takes no parameters, because the closure is packaged with parameter values while invoking
func f3(pClosure: @autoclosure () -> Int) {

    print("f3")

    let value = pClosure()

    print("value = \(value)")
}

f1(pValue: add(a: 10, b: 20))
print("=====================\n")

f2(pClosure: add, pA: 10, pB: 20)
print("=====================\n")

f3(pClosure: add(a: 10, b: 20))
print("=====================\n")
Run Code Online (Sandbox Code Playgroud)

输出:

add
f1
value = 30
=====================

f2
add
value = 30
=====================

f3
add
value = 30
=====================
Run Code Online (Sandbox Code Playgroud)

示例说明:

  • 在函数 f1 中,pValue 是一个 Int 值。
  • 所以当 f1 被调用时, add 被评估
  • 在函数 f2 和 f3 中,pClosure 是一个闭包。
  • pClosure(闭包)在函数内部被调用之前不会被评估。

笔记:

  • 关注f3first 接受一个闭包作为参数。
  • 一旦你完全理解f3,然后检查f2
  • 自动关闭在调用时捕获参数值并在以后使用它。

为什么以及何时需要传递闭包而不是值:

  • 可能存在一种情况,您希望将 的执行推迟add到函数f2调用它的时间。
  • 可能存在一种情况,您发出异步请求,并且希望在请求完成时执行一段代码。在这种情况下,您可能会传递一个闭包。(闭包不需要总是返回一个值,它是一个未命名的函数,所以它可以接受参数)

为什么以及何时需要自动关闭:

  • 当您想推迟执行add并捕获其参数的值时。

建议:

  • 虽然很费时间,但最好从头阅读 Swift 文档以完全理解它。

参考:

正如 Hamish 所指出的,请阅读关于闭包的内容,然后是来自https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html 的自动闭包