San*_*ari 4 closures function ios swift
我有近4年的Objective C经验和快速新手.我试图从Objective C的角度理解swift的概念.所以,如果我错了,请指导我:)
在目标c中,我们有块(可以在以后异步执行的代码块),这绝对是完美的意义.但是现在我们可以将一个函数作为参数传递给另一个函数,这个函数可以在以后执行,然后我们也可以关闭它.
根据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}))
}
Run Code Online (Sandbox Code Playgroud)
变量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)
}
}
Run Code Online (Sandbox Code Playgroud)
在一个不同的类中,我创建了一个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))
}
Run Code Online (Sandbox Code Playgroud)
声明了一个名为test的类,它有一个名为testFunctionAsParameter的方法,该方法又调用另一个名为callLater的方法,最后这个方法执行传递的函数:)
现在所有这些马戏团,只是为了确保传递的方法在不同的范围内执行:)
当我执行上面的代码:)我很震惊地看到即使作为参数传递的函数最终在不同的范围内执行,仍然可以访问与方法声明在相同范围内声明的变量testNumber :)
我得出结论:O'Reilly的陈述"当一个函数作为一个值传递时,它带有对外部变量的内部引用." 爆炸:)
现在我怀疑是苹果说功能是条款的特殊情况.我认为特殊情况必须与范围有关:)但令我惊讶的是,代码显示闭包和函数都可以访问外部范围内的变量!
其他,语法不同如何闭包与作为参数传递的函数不同??? 现在必须在内部有一些差异,否则苹果不会花太多时间来设计它:)
如果不是范围?那么闭包和功能还有什么不同?O'Reilly说"当一个函数作为一个值传递时,它会携带对外部变量的内部引用.这就是使函数成为闭包的原因." 那么它试图指出什么呢?那个闭包不会带有对外部变量的引用?现在他们也不会错,是吗?
Apple和O'Reilly的两个相互矛盾的陈述让我很生气:(请帮助,我理解错误了吗?请帮助我理解其中的区别.
在swift中,函数和闭包之间确实没有任何区别.闭包是一个匿名函数(一个没有名字的函数.)这就是它,除了你注意到的语法差异.
在Objective-C函数和块/闭包中是不同的.
根据你的帖子,看起来你对这个主题有一个非常全面的理解,你可能只是迷失在语义中.它基本归结为:
1. a closure is a closure
2. a function is a closure with a name
Run Code Online (Sandbox Code Playgroud)
这是一篇更详细的帖子.但同样,它主要是对语义的讨论."答案"非常简单.