4

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)

…または、ジェネリック関数の特定のインスタンス化のみを渡すことができますか?

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

これがサポートされていない場合の回避策は、ジェネリック関数を構造体のメソッドなどとして定義し、その代わりに an を渡すことです。ただし、これは理想的ではありません。使用する関数は適切な呼び出し構文を取得できないため、次のことを行う必要があります。

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

3 に答える 3

4

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

ただし、swift-evolution メーリング リストで議論されています。

于 2016-05-13T23:53:31.623 に答える
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)

(ここで実行できます)

于 2016-05-13T20:41:03.217 に答える
0

この質問をしてから5年後、Swiftはこのようなものをサポートしていることに気付きましたcallAsFunction.

次に例を示します。


final class Service<T> {
    // Implementation here
}

final class Attacher {
    // Important state here.
    var state = Void()
    
    func callAsFunction<T>(service: Service<T>, to: T) {
        // Implementation here.
    }
}

func doAttaching(attach: Attacher) {
    attach(service: Service<Int>(), to: 42)
    attach(service: Service<String>(), to: "Hello World!")
}

ARepeaterを汎用コードに渡して、便利な動作を提供できます。

于 2022-01-13T09:14:30.557 に答える