2014-11-14 7 views
6

C'è qualche differenza in rapida tra dichiarazione di funzione:Differenza tra funzione e la chiusura assegnazione

func function(a: String) { 
    print(a); 
} 
function("test"); 

e la chiusura incarico?

+0

Una differenza è che non è possibile definire la chiusura al curry ma è possibile definire la funzione al curry. Un'altra differenza è che non è possibile definire la chiusura ricorsiva, ma è possibile definire una funzione ricorsiva – mustafa

risposta

5
  1. anonimo o

    func function(a: String) { 
        print("\(a), name: \(__FUNCTION__)"); 
    } 
    
    let closure = { (a: String) in 
        print("\(a), name: \(__FUNCTION__)"); 
    } 
    
  2. Lista Capture
    supportate solo le chiusure:

    let obj = FooClass() 
    let closure = { [weak obj] in ... } 
    
  3. funzione curry
    supportate solo funzioni:

    func curriedFunc(x:Int)(y:Int) { ... } 
    let curried = curriedFunc(1) 
    curried(y:2) 
    

    simili, ma non è esatto lo stesso con l'utilizzo di chiusura:

    let closure = { (x:Int) in { (y:Int) in ... }} 
    
  4. Generics
    supportate solo funzioni:

    func function<T>(x:T) { ... } 
    
  5. referenceability dalla propria dichiarazione iniziale
    supportate solo in funzioni globali:

    func recursive(var x:Int) -> Int { 
        ... 
        return condition ? x : recursive(x) 
    } 
    

    si può fare questo con la chiusura anche:

    var recursive:((Int) -> Int)! 
    recursive = { (var x) in 
        ... 
        return condition ? x : recursive(x) 
    } 
    

    Ma questo non è raccomandato perché questo fa sì riferimento forte cicli.

  6. sovraccarico
    supportate solo funzioni:

    func function(a: String) { print("String: \(a)") } 
    func function(a: Float) { print("Float: \(a)") } 
    

    N.B.È possibile fare riferimento come chiusura come questo:

    let f:(Float) -> Void = function 
    
+0

"Ma questo non è raccomandato perché ciò causa forti cicli di riferimento." No, non lo è. – newacct

0

Un'altra differenza: ricorsività all'interno di un'altra funzione

funzioni nidificate non possono essere ricorsive:

func foo() { 
    func bar() { bar() } // does not compile 
} 

ma chiusure dentro altra le funzioni possono essere ricorsive:

func foo() { 
    var bar: (() ->())! 
    bar = { bar() } 
}