在变量中使用闭包时,swift变量和函数有什么区别?

时间:2015-12-03 04:46:19

标签: ios swift

当在变量中使用时,Swift closure让我感到困惑。请考虑以下示例

let divide = {(val1: Int, val2: Int) -> Int in 
   return val1 / val2 
}
let result = divide(200, 20)
println(result)

这里divide是一个变量,但它可以带参数。我从其他语言知道,只有函数可以参数。那么,变量和函数之间有什么区别?在swift变量中使用clousure有什么好处?

3 个答案:

答案 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的参数是一个闭包;它从闭包的词汇环境中捕获绑定到selfmessage的值。