我有近4年的Objective C经验和swift的新手。我试图从目标C的角度理解swift的概念。所以,如果我错了,请指导我:)
在目标c中,我们有块(可以在以后异步执行的代码块),这绝对是完美的意义。但是现在swift我们可以将一个函数作为参数传递给另一个函数,这个函数可以在以后执行,然后我们也有闭包。
根据 Apple "函数是子句的特例。"
根据 O' Reilly "当函数作为值传递时,它会携带对外部变量的内部引用。这就是使函数成为闭包的原因。"
所以我尝试了一下以了解相同的内容:)
这是我的关闭
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a ni
let tempNumber : Int = 5
let numbers = [1,2,3,4,5]
print (numbers.map({ $0 - tempNumber}))
}
变量tempNumber甚至在声明闭包之前就已声明,但闭包具有对变量的访问权限。现在而不是地图,我尝试使用自定义类传递闭包作为参数并尝试执行相同的代码:)虽然现在关闭在不同的范围内执行,但它仍然可以访问tempNumber。
我得出结论:闭包可以访问变量和方法,这些变量和方法在与自身封闭相同的范围内声明,尽管它在不同的范围内被执行。
现在而不是将闭包作为参数传递,尝试将函数作为参数传递,
class test {
func testFunctionAsParameter(testMethod : (Int) -> Int){
let seconds = 4.0
let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
self.callLater(testMethod)
})
}
func callLater(testMethod : (Int) -> Int) -> Int {
return testMethod(100)
}
}
在一个不同的类中,我创建了一个Test实例并将其用作以下
/* in differrent class */
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a ni
let tempAge : Int = 5
func test2(val : Int) -> Int {
return val - tempAge;
}
let testObj = test();
print(testObj.testFunctionAsParameter(test2))
}
声明了一个名为test的类,它有一个名为testFunctionAsParameter的方法,该方法又调用另一个名为callLater的方法,最后这个方法执行传递的函数:)
现在所有这些马戏团,只是为了确保传递的方法在不同的范围内执行:)
当我执行上面的代码:)我很震惊地看到即使作为参数传递的函数最终在不同的范围内执行,仍然可以访问与方法声明在相同范围内声明的变量testNumber :)
我得出结论:O' Reilly的陈述"当一个函数作为一个值传递时,它带有对外部变量的内部引用。"爆炸了:))
现在我怀疑是苹果说功能是条款的特殊情况。我认为特殊情况必须与范围有关:)但令我惊讶的是,代码显示闭包和函数都可以访问外部范围内的变量!!!!
其他,语法不同如何闭包与作为参数传递的函数不同???现在必须在内部存在一些差异,否则Apple在设计它时不会花费太多时间:)
如果不是范围?那么闭包和功能还有什么不同? O' Reilly陈述"当函数作为值传递时,它会携带对外部变量的内部引用。这就是使函数成为闭包的原因。"那么它试图指出什么呢?那个闭包不会带有对外部变量的引用?现在他们也不会错,是吗?
我对Apple和O&#Re;的两个相互矛盾的陈述感到生气:(请帮助,我理解错误了吗?请帮助我理解差异。
答案 0 :(得分:6)
在swift中,函数和闭包之间确实没有任何区别。闭包是一个匿名函数(一个没有名字的函数。)关于它,除了你注意到的语法差异。
在Objective-C函数和块/闭包中是不同的。
答案 1 :(得分:6)
根据你的帖子,看起来你对这个主题有一个非常全面的理解,你可能只是迷失在语义中。它基本归结为:
1. a closure is a closure
2. a function is a closure with a name
这是一篇包含更多细节的帖子。但同样,它主要是对语义的讨论。 "答案"非常简单。