首页 > 解决方案 > 在闭包调用者中使用泛型

问题描述

我有 2 个重载函数,我正在尝试使用它们在调用者中使用泛型的签名来调用它们。例如:

func sum(_ i: Int, _ s: Int){
print("sum \(i+s)")
}

func sum(_ i: String, _ s: Int){
var res: String="";
for _ in 1...s{
    res += i
}
print("Repeat \(res)")
}

func sumCaller<T>(_ f: T){
print(type(of: f)) // compiler prints the value is function (Int,Int)->Void !!!
}

sumCaller(sum as (Int, Int)->Void)

这里一切都很好。但是当我试图像这样打电话fsumCaller

func sumCaller<T>(_ f: T){
print(type(of: f)) //compiler prints the value is function (Int,Int)->Void !!!
f(1,3)
}

编译器抛出错误:

error: testing.playground:68:5: error: cannot call value of non-function type 'T' f(1,3)

但它仍然是我作为sumCaller参数传递的同一个函数。拜托,有人可以解释我的错误吗?

标签: swiftgenericsclosuresoverloading

解决方案


我不确定你的目标是什么,但下面的代码“做某事”。希望这是您正在寻找的:

func sum(_ i: Int, _ s: Int){
    print("sum \(i+s)")
}

func sum(_ i: String, _ s: Int){
    var res: String="";
    for _ in 1...s{
        res += i
    }
    print("Repeat \(res)")
}

func sumCaller<A, B>(_ f: (A, B) -> Void, a: A, b: B) {
    print(type(of: f)) // compiler prints the value is function (Int,Int)->Void !!!
    f(a, b)
}

sumCaller(sum, a: 2, b: 3)
sumCaller(sum, a: "Test", b: 3)

推荐阅读