Diferença entre fechamento e função como argumento em rápida

Tenho quase 4 anos de experiência com o Objective C e um novato em rápido. Estou tentando entender o conceito de swift da perspectiva do objetivo C. Então, se eu estiver errado, por favor, me guie através :)

No objetivo c, temos blocos (chunck de código que pode ser executado posteriormente de forma assíncrona) que faziam absolutamente sentido. Mas agora, rapidamente, podemos passar uma função como parâmetro para outra função, que pode ser executada mais tarde, e também temos fechamento.

Conformemaçã "funções são casos especiais de cláusulas."

ConformeO'Reilly "quando uma função é transmitida como um valor, ela carrega suas referências internas para variáveis externas. É isso que torna uma função um fechamento."

Então tentei entender um pouco o mesmo :)

Aqui está o meu encerramento

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}))
}

A variável tempNumber é declarada antes mesmo de o fechamento ser declarado, mas o fechamento tem acesso à variável. Agora, em vez de um mapa, tentei usar uma classe personalizada passada como parâmetro e tentei executar o mesmo código :) Embora agora o fechamento esteja sendo executado em escopo diferente, ele ainda tem acesso a tempNumber.

Concluí: os fechamentos têm acesso às variáveis e métodos declarados no mesmo escopo que o fechamento, embora sejam executados em escopo diferente.

Agora, em vez de passar o fechamento como parâmetro, tentei passar a função como parâmetro,

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)
    }
}

Em uma classe diferente, criei uma instância de Teste e a usei da seguinte forma

/* 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))
        }

Declarou uma classe chamada test, que possui um método chamado testFunctionAsParameter que, por sua vez, chama outro método chamado callLater e, finalmente, esse método executa a função passada :)

Agora, todos esses circos, apenas para garantir que o método passado seja executado em escopo diferente :)

Quando executei o código acima :) Fiquei chocado ao ver que, embora a função passada como parâmetro finalmente seja executada em escopo diferente, ainda tenha acesso às variáveis testNumber que foram declaradas no mesmo escopo da declaração do método :)

Concluí: a afirmação de O'Reilly "quando uma função é passada como um valor, ela carrega suas referências internas para variáveis externas". foi estrondo :)

Agora, minha dúvida é que a apple diz que funções são casos especiais de cláusulas. Eu pensei que caso especial deve ter algo a ver com o escopo :) Mas, para minha surpresa, o código mostra que o fechamento e a função têm acesso a variáveis no escopo externo !!!!

Caso contrário, diferença de sintaxe como o fechamento é diferente da função passada como argumento ??? Agora deve haver alguma diferença interna, caso contrário, a Apple não gastaria tanto tempo projetando-a :)

Se não for o escopo? então o que mais é diferente no fechamento e na função? O'Reilly afirma "quando uma função é transmitida como um valor, ela carrega suas referências internas para variáveis externas. É isso que torna uma função um fechamento". então o que ele está tentando apontar? esse fechamento não carregará referências a variáveis externas? Agora eles também não podem estar errados, estão?

Estou enlouquecendo com duas declarações conflitantes da Apple e O'Reilly :( Por favor, ajude, estou entendendo algo errado? Por favor, ajude-me a entender a diferença.

questionAnswers(2)

yourAnswerToTheQuestion