关闭和函数之间的差异作为swift中的参数

时间:2016-04-12 14:37:32

标签: ios swift function closures

我有近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;的两个相互矛盾的陈述感到生气:(请帮助,我理解错误了吗?请帮助我理解差异。

2 个答案:

答案 0 :(得分:6)

在swift中,函数和闭包之间确实没有任何区别。闭包是一个匿名函数(一个没有名字的函数。)关于它,除了你注意到的语法差异。

在Objective-C函数和块/闭包中是不同的。

答案 1 :(得分:6)

根据你的帖子,看起来你对这个主题有一个非常全面的理解,你可能只是迷失在语义中。它基本归结为:

1. a closure is a closure
2. a function is a closure with a name

这是一篇包含更多细节的帖子。但同样,它主要是对语义的讨论。 "答案"非常简单。

What is the difference between functions and closures?