闭包如何捕获值?

时间:2015-04-24 04:53:31

标签: ios swift closures

我发布了一个关于关闭的问题,但它一直保持不变 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数组中获取值的?

2 个答案:

答案 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的实现方式相同。