2016-11-29 2 views
3

Ich versuche eine Funktion zu schreiben, die jede Funktion als Parameter annehmen und in Swift ausführen kann. Ich habe diesen Ansatz versucht:Wie übergibt man eine Funktion als Parameter und führt sie in Swift aus?

public func anyFunc<P, T> (_ function: (P...) -> T) { 
    _ = function()  
} 

und versuchen es dann mit:

anyFunc(print("hello")) 

Dies erzeugt ERROR: 'print' produces '()', not the expected contextual result type '(_...) -> _'

Wie kann ich dies erreichen (und ist es möglich)?

+0

Warum verwenden Sie '' ? Sollte die bestandene Funktion ungültig werden? –

+3

'print (" hallo ")' ist _ ein Aufruf_ an die Funktion 'print', die ein Ergebnis liefert (das leere Tupel,'() '). Daher ist Ihr Aufruf von 'anyFunc' gleichbedeutend mit' anyFunc (()) ', was natürlich eine Diskrepanz für die Argumente von' anyFunc' ist. – dfri

+0

Wie erwartet man normalerweise 'function()', ohne irgendwelche Argumente zu übergeben, wenn eine beliebige Anzahl von Argumenten benötigt wird? – jtbandes

Antwort

3

Wie wäre es nur @autoclosure verwenden, etwa so:

func anyFunc<T>(_ closure: @autoclosure() -> T) { 
    let result: T = closure() 
    // TODO: Do something with result? 
} 

anyFunc(print("hello")) 
+0

Dies ist genau das, was ich brauchte! Ich wusste nicht über '@ autoclosure'. Ich fügte auch einen Rückgabetyp von "T" und "return result" am Ende hinzu. Vielen Dank – ilovebigmacs

Verwandte Themen