封闭与function之间的区别作为迅速的论证
我有近4年的Objective C经验和一个新手。 我试图从Objective C的angular度来理解swift的概念,所以如果我错了,请引导我:)
在目标c中,我们有块(可以asynchronous执行的代码块),这是非常完美的。 但是现在我们可以把一个函数作为parameter passing给另一个函数,这个函数可以稍后执行,然后我们也可以closures它。
按照苹果 “function是条款的特例”。
按照O'Reilly的 说法,“当一个函数作为一个值传递时,它会传递给外部variables的内部引用,这就是函数的一个闭包。
所以我试了一下理解相同:)
这是我的closures
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})) }
variablestempNumber甚至在声明闭包之前声明,但闭包有权访问variables。 现在,而不是一个地图,我试图使用自定义类传递闭包作为参数,并尝试执行相同的代码:)虽然现在闭包得到执行在不同的范围,它仍然有访问tempNumber。
我得出的结论是:闭包有权访问在与自己closures的范围内声明的variables和方法,尽pipe它在不同的范围内被执行。
现在,而不是传递闭包作为参数,尝试传递函数作为参数,
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) } }
在一个不同的类中,我创build了一个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的方法,最后该方法执行传递的函数:)
现在所有这些马戏团,只是为了确保通过的方法得到不同的范围执行:)
当我执行上面的代码:)我很震惊地发现,即使作为parameter passing的函数最终在不同的作用域中执行,仍然可以访问与方法声明在同一范围声明的variablestestNumber 🙂
我得出结论:O'Reilly的声明“当一个函数作为一个值被传递时,它带有对外部variables的内部引用”。 被轰炸了:)
现在我怀疑苹果说function是条款的特例。 我认为特殊情况必须与范围有关:)但令我惊讶的是,代码显示闭包和函数都可以访问外部variables的variables!
除此之外,语法不同是如何闭包是不同的函数作为parameter passing? 现在内部肯定有一些差别,否则苹果公司就不会花太多时间来devise它:)
如果不是范围?? 那么闭包和函数还有什么不同呢? O'Reilly指出:“当一个函数被作为一个值传递时,它会传递给外部variables的内部引用,这就是函数的一个闭包。 那么有什么要指出的呢? 该封闭不会携带对外部variables的引用? 现在他们也不会错,是吗?
我疯了与苹果和O'Reilly两个冲突的声明:(请帮助,我的理解错了吗?请帮我理解差异。
在迅速的function和封闭之间确实没有任何区别。 闭包是一个匿名函数(一个没有名字的函数)。除了你记下的语法差异之外,就是关于它的。
在Objective-C函数和块/closures是不同的。
根据你的文章,看起来你对这个主题有一个非常充分的理解,你可能会迷失在语义。 基本上归结为:
1. a closure is a closure 2. a function is a closure with a name
这里有一个更详细的信息。 但是,这又是一个关于语义的讨论。 “答案”非常简单。
函数和闭包有什么区别?