当在变量中使用时,Swift closure
让我感到困惑。请考虑以下示例
let divide = {(val1: Int, val2: Int) -> Int in
return val1 / val2
}
let result = divide(200, 20)
println(result)
这里divide
是一个变量,但它可以带参数。我从其他语言知道,只有函数可以参数。那么,变量和函数之间有什么区别?在swift变量中使用clousure
有什么好处?
答案 0 :(得分:2)
Simply Closure是一个代码块(匿名函数),你可以将它作为一个对象并在viewcontroller之间传递它,如果你想在函数完成后或按下一个按钮后做一些事情,那就很好(可以实现与protocol / delegate,unwind,...)相同,它也可以像函数一样使用参数并返回值
最棒的是,它可以让你访问非局部变量(当你将它传递给另一个viewcontroller时)然后你可以用它来做任何东西
答案 1 :(得分:0)
在您的示例中,它并没有真正突出闭包和函数之间的区别。闭包和功能非常相似。比如函数如何接受参数,或者如果在类中定义了变量,则使用函数之外的变量,闭包可以做同样的事情,但是从它自己的局部范围内。
psuedo代码示例:
class aaa {
var a = 5;
func foo (b:Int) -> Int {
return a+b; //a not defined in local scope, but we can still use it
}
}
现在有一个闭包它同样的东西,但你可以使用局部变量,就像使用在类级别定义的变量一样
class bbb {
var b = 1;
var closure;
func foo (c:Int) -> Int {
var d = b+c; //d is defined locally
closure = (val1:Int) -> Int { Int in
return val1 + b * d; //we can use b and d here! they are captured in the block now, and will remain with the block until executed
}
}
func bar () {
b = 3;
closure(5); //now we execute closure, now the variable d in foo() is being used but in a completely different scope, and even if we changed the value of b before running it, the value of b would be the original value captured in the closure when it was made aka 1 and not 3
}
}
所以现在如果你运行foo然后bar,你可以看到闭包与函数的区别
所以真正的美在于本地捕获变量,以后可能在一个完全不同的范围内使用,因为函数只能使用你给它们的参数和/或类中定义的变量< / p>
答案 2 :(得分:0)
变量保存/引用值;函数是一个值。因此,变量可以包含/引用数字,字符串,实例以及某些语言的函数。允许变量保存/引用函数的语言是具有“first class functions”
的语言闭包的好处是它们可以“捕捉”'lexical scope'中的值。例如,假设您需要一个在某些计算完成时执行的回调函数。您希望回调解除视图控制器并记录一些信息:
class MyViewController : ViewController {
func takeAction (message:String) {
// do some stuff, then
doComputation {
self.dismissViewController()
NSLog ("took action: \(message)")
}
}
}
在上面,doComputation
的参数是一个闭包;它从闭包的词汇环境中捕获绑定到self
和message
的值。