2016-05-13 9 views
4

Swiftには引数として渡すことができるファーストクラスの関数があります。迅速なファーストクラスジェネリック機能?

func a() { 
} 

func b(x:()) { 
} 

// Pass a to b… 
b(a) 

スウィフトには汎用機能があります。

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

しかし、スウィフトは、私は別の関数の引数としてジェネリック機能を通過させていますか?

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) 

...それとも、ジェネリック関数の特定のインスタンスを渡すことができますか?

可能であれば、ジェネリック関数を引数として受け入れる関数を定義するための構文を説明してください。

これがサポートされていない場合、回避策は、汎用関数をstructなどのメソッドとして定義し、代わりにそれを渡すことです。これは、かかる機能は、このような素敵な呼び出し構文を取得していないとして、彼らがする必要がある、しかし理想的ではありません。

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')によって決まる特定のインスタンスを取得しています。あなたの例で 'identity 'を_fulful_関数として' callFunction'に渡したいと思います。 'callFunction'の定義は、' function'引数を複数の型で呼び出すことができます。 – Benjohn

+0

ああ私は、申し訳ありませんが、私は投稿を間違って見て参照してください:( – Alexander

+0

問題ありません!ありがとうとにかく:-) – Benjohn

4

この機能は通常Higher-Kinded Types(HKT)と呼ばれ、現在Swiftではサポートされていません。

しかし、これはdiscussed on the swift-evolution mailing listです。

+0

ハ!本当に? :-)これは面白いことですが、私は過去に数種類の種について読んでいたので、何について話しているのか全く分からなかったからです。今私は知っている!スーパー - それは将来のバージョンを作る場合美しいだろう。返信してくれてありがとう。 – Benjohn