2016-05-13 3 views
4

Swift имеет функции первого класса, которые могут передаваться в качестве аргументов.Первоначальная универсальная функция в swift?

func a() { 
} 

func b(x:()) { 
} 

// Pass a to b… 
b(a) 

Swift имеет общие функции.

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

Но, делает Swift позвольте мне передать общую функцию в качестве аргумента другой функции?

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) 

... Или это позволяет мне передать конкретную копию универсальной функции?

Если это возможно, пожалуйста, проиллюстрируйте синтаксис для определения функции, которая принимает общую функцию как аргумент.

Если это не поддерживается, обходным путем является определение общей функции как метода структуры или чего-то еще, и вместо этого передать вместо нее. Это не идеально, хотя, как функция потребления не получает такой хороший синтаксис вызова, они должны сделать:

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

ответ

0

Да, вот пример:

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

Спасибо за ответ, но я не думаю, что это делает то, что мне нужно. Таким образом, вызываемая функция в вашем примере 'callFunction' по-прежнему не получает универсальную функцию. Он получает конкретный экземпляр, определяемый типом 'parameter', с которым вы звоните, - в этом случае' 123', поэтому Int. Я хочу передать 'identity' в вашем примере как функцию _fully generic_ для' callFunction'. Определение 'callFunction' может затем вызывать аргумент' function' с несколькими типами. – Benjohn

+0

О, я вижу, извините, я неправильно понял сообщение :( – Alexander

+0

Нет проблем! Спасибо в любом случае :-) – Benjohn

4

Эта функция обычно называется Higher-Kinded Types (HKT) и в настоящее время не поддерживается в Swift.

Это, однако, discussed on the swift-evolution mailing list.

+0

Hah! В самом деле? :-) Это смешно, потому что я читал о более высоких типах в прошлом несколько раз и совершенно не знал, о чем они говорили. Теперь я знаю! Супер - было бы здорово, если бы это сделало будущую версию. Спасибо за ваш ответ. – Benjohn

Смежные вопросы