我发布了一个关于关闭的问题,但它一直保持不变 When to use closures in swift?
现在我想详细介绍并更具体。这条线如何运作?
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = sorted(names, backwards)
当我将一个函数作为参数传递时。这是如何从names数组中获取值的?
答案 0 :(得分:0)
您应该查看the documentation,但这是一个示例排序函数(选择排序,因为这是最简单的):
func selectionSort<T>(inout array: [T], comparator: (T,T) -> Bool) {
var min: Int
for n in 0..<array.count {
min = n
for x in (n + 1)..<array.count {
if comparator(array[x], array[min]) {
min = x
}
}
if min != n {
let temp = array[min]
array[min] = array[n]
array[n] = temp
}
}
}
selectionSort(&names, backwards)
正如您所看到的,函数使用闭包检查顺序,闭包被调用的确切次数取决于sorted
函数实现的实现。
答案 1 :(得分:-8)
大多数Java脚本开发人员都在关闭,即使他们在多个地方使用闭包。有很多博客可以解释Closure。我遇到了大多数博客,并决定让它变得更加简单。 以一种非常简单的方式,我可以说Closure是一个函数,它具有变量的内存,在其中定义了它。
实施例1,:
function increment(i){
return function(){
return i++;
}
}
var increase_1 = increment(5); //passing a reference or scope variable 5
//increase_1 store value of i as 5 in memory
increase_1() //5
increase_1() //6
increase_1()
//7
我们有另一个简单的例子 例2:
add(3,5);
add(3)(5);
现在我需要一个可以执行两个表达式的函数....
function add(a,b){
if(arguments.length===2){
return a+b;
} else {
return function(b){
return a+b;
}
}
}
例:3:
// A typical example
function addLinks () {
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function(){
console.log(i);
}
document.body.appendChild(link);
};
}
addLinks();
//这将是什么输出。 执行此操作时,它会创建一个链接,单击它将打印一些值。 那么点击link1时打印的价值是多少呢。考虑一下......我知道,最初你会感到困惑。 是的它打印5。 不仅点击这个特定的链接,而且在每个链接上,它给你5。 所以,现在我要打印0,1,2,3,4。是的,当我点击link0时它是正确的,它在link1上打印0,它打印1,依此类推...... 现在,我希望你仔细检查一下示例1并尝试以相同的方式实现并尝试记住一些自我执行的annonmys函数。
function addLinks () {
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function(c){
return function(){
console.log(c);
}
}(i);//passing a reference
document.body.appendChild(link);
};
}
addLinks();
因此,如果您仔细看到此示例,则当事件处理程序与链接绑定时,将传递引用或作用域。 这与jQuery的实现方式相同。