2016-05-13 9 views
4

Swift verfügt über erstklassige Funktionen, die als Argumente übergeben werden können.Erstklassige generische Funktion in swift?

func a() { 
} 

func b(x:()) { 
} 

// Pass a to b… 
b(a) 

Swift hat generische Funktionen.

func generic<T>(x: T) { 
} 

Aber tut Swift mich an eine andere Funktion eine generic Funktion als Argument übergeben lassen?

let anIntService = Service<Int>() 
let astringService = Service<String>() 

func attach<T>(service: Service<T>, to value: T) { 
    // Perform type safe attaching of `value` to `service`. 
} 

func doAttaching(attach: (Service<T>, to T)->Void) { 
    attach(anIntService, to: 42) 
    attach(aStringService, to: "Hello World!") 
} 

doAttaching(attach) 

... Oder lässt es mich nur eine spezifische Instanziierung einer generischen Funktion passieren?

Wenn dies möglich ist, veranschaulichen Sie bitte die Syntax zum Definieren einer Funktion, die eine generische Funktion als Argument akzeptiert.

Wenn dies nicht unterstützt wird, besteht eine Umgehungslösung darin, die generische Funktion als eine Methode einer Struktur oder etwas zu definieren und statt dessen eine zu übergeben. Dies ist zwar nicht ideal, da die verzehrende Funktion nicht eine so schöne Berufung Syntax bekommt, was sie tun müssen:

func doAttaching(attach: Attacher) { 
    attacher.attach(anIntService, to: 42) 
    attacher.attach(aStringService, to: "Hello World") 
} 

Antwort

0

Ja, hier ist ein Beispiel:

func identity<T>(param: T) -> T { 
    return param 
} 

func callFunction<U>(function: U->U, paramater: U) -> U { 
    return function(paramater) 
} 

let param = 123 

let result = callFunction(identity, paramater: param); 

print(result) 

(You can run it here)

+1

Danke für die Antwort, aber ich denke nicht, dass das tut, was ich brauche. So ruft die aufgerufene Funktion in Ihrem Beispiel, callFunction, die generische Funktion immer noch nicht auf. Es erhält eine bestimmte Instanz davon, bestimmt durch den Typ des 'Parameters', den Sie aufrufen - in diesem Fall '123', also ein Int. Ich möchte die 'Identität' in Ihrem Beispiel als eine _fully generic_ Funktion an 'callFunction' übergeben. Die Definition von 'callFunction' kann dann ihr' function' -Argument mit mehreren Typen aufrufen. – Benjohn

+0

Oh ich sehe, sorry, ich habe den Beitrag missverstanden :( – Alexander

+0

Kein Problem! Danke trotzdem :-) – Benjohn

4

Diese Funktion wird häufig Higher-Kinded Types (HKT) genannt und wird derzeit in Swift nicht unterstützt.

Es wurde jedoch discussed on the swift-evolution mailing list.

+0

Hah! "Ja wirklich?" :-) Das ist witzig, weil ich in der Vergangenheit ein paar Mal über höhergestufte Typen gelesen habe und absolut keine Ahnung hatte, wovon sie redeten. Jetzt weiß ich! Super - es wäre schön, wenn es eine zukünftige Version macht. Danke für Ihre Antwort. – Benjohn