Swift与闭包和一流函数之间的任何区别?

Jeg*_*ggy 9 closures first-class-functions swift

在Swift文档中,Apple说:

闭包是自包含的功能块,可以在代码中传递和使用.Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas.

我认为是第一类功能的定义

他们也这样说:

闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用.这被称为关闭那些常量和变量.Swift为您处理捕获的所有内存管理.

我认为这是封闭的定义,而另一种缺陷是一流的功能,但Apple似乎把它们放在一起并称之为封闭.

我误解了什么吗?或者是Apple调用闭包和一流的函数闭包?

我已经编写了这个示例代码,并且想知道我是否在撰写评论中是对的?

// 'a' takes a first class function, which makes 'a' a higher order function
func a(ch: () -> Void){
    print("Something")
    ch()                // 'ch' is a first class function
    print("Ended")
}

func closureFunc(){
    var num = 2
    a({
        // access to 'num' is possible by closures
        num = num*2
        print(num)
    })
}

closureFunc()
Run Code Online (Sandbox Code Playgroud)

Ale*_*ica 9

头等函数是一种语言的功能,允许,可以就好像它是任何其它类型的数据被分配给一个变量,并通过周围的功能.闭包,lambdas和匿名函数都是"一流函数".

匿名函数(也称为Lambda函数)是没有名称的函数(例如a(ch:)具有名称的方式).因为它们没有名称,所以使用它们的唯一方法是将它们存储在变量中或作为参数传递(参数本质上是变量).因此,所有匿名函数也是第一类函数.

闭包是捕获周围状态的一流函数.他们可以是匿名的,也可以有名字.命名闭包只是您的常规func功能.

a(ch:) 是一个更高阶的函数,正确.

ch 是一个First Class函数(因为它存储在一个变量中),一个Lambda(与FCF同义),也可能是一个闭包,取决于它的主体是否引用任何外部变量.

a(ch:)使用该块调用的情况下,ch是一个闭包,因为它正在捕获num.

  • "闭包是匿名函数"没有_All_函数是Swift中的闭包. (2认同)

mat*_*att 6

这些概念是正交的.它们没有直接关系; 它们是关于Swift函数的两个事实.

  • 功能是一流的.这意味着它们可以被传递 - 被指定为变量,作为参数传递给函数参数,并作为结果传递出函数.

  • 功能是闭包.这意味着,在定义的角度来看,他们捕捉提到的环境里面的函数体,但声明以外的函数体.

这是一个例子(来自游乐场):

func multiplierMaker(i:Int) -> (Int) -> (Int) {
    func multiplier(ii:Int) -> (Int) {
        return ii*i
    }
    return multiplier
}
let g = multiplierMaker(10)
g(2) // 20
Run Code Online (Sandbox Code Playgroud)

想想这个功能multiplier:

  • 这一事实multiplier可被返回作为函数的结果multiplierMaker,以及分配给g,并且它具有良好定义的类型(Int) -> (Int),是因为函数是一流.

  • 事实上,当传入10时multiplierMaker,结果multiplier函数将其参数乘以10,即使分配给g稍后调用,也是因为函数是闭包.

(请注意,这与匿名函数无关.所有回答或语句都会导致您认为闭包与匿名函数有关.这个例子中没有匿名函数.匿名函数一个闭包,但只是因为所有功能都是闭包.)