使用variadic参数编译时间错误,将函数作为参数传递给另一个函数

时间:2018-03-20 09:06:13

标签: swift variadic-functions

我是Swift的新手,我在Playground中遇到编译时错误(在“返回f(值)”语句中突出显示):

错误:MyPlayground.playground:6:14:错误:无法将类型'[Int]'的值转换为预期的参数类型'Int'     返回f(值)

代码如下:

func max (_ values : Int...) -> Int {
    var maxVal : Int = values[0]
    for i in values {
        if (i > maxVal) {
            maxVal = i
        }
    }
    return maxVal
}

func fun (by f:(Int...) -> Int, values:Int... ) -> Int {
    return f(values)
}


print(fun(by:max, values:1,2,3,4,5))

代码中的错误是什么?谢谢你的进步。

编辑: 答案“如何使用可变参数转发函数?”建议用数组参数调用另一个函数,我不想要,因为会有额外的函数调用开销。

我的问题是:代码在语法上看是正确的,请帮助指出可能的错误,以便在其他地方遇到我可以纠正它。感谢。

实际上如果我用“[Int]”替换所有“Int ...”,一切正常,但调用者声明会有点难看......

编辑2: 从Swift 4.1开始(在Xcode 9.2中),转发可变参数的函数将IMPLICITLY将其更改为单个参数数组的单个参数。解决方法:

func max (_ values : [Int]) -> Int {
    var maxVal : Int = values[0]
    for i in values {
        if (i > maxVal) {
            maxVal = i
        }
    }
    return maxVal
}

func fun (by f:([Int]) -> Int, values:Int... ) -> Int {
    return f(values)
}

print(fun(by:max, values:1,2,3,4,5))

不知道这是否是编译器的错误:)

0 个答案:

没有答案