在Swift中将列表从一个函数传递到另一个函数

时间:2014-06-03 06:35:59

标签: swift variadic-functions

我无法理解为什么我不能将Int []从一个函数传递到另一个函数:

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

func average(numbers:Int...) -> Double {
    var sum = sumOf(numbers)

    return Double(sum) / Double(numbers.count)
}

这给了我以下错误:

Playground execution failed: error: <REPL>:138:19: error: could not find an overload for '__conversion' that accepts the supplied arguments

var sum = sumOf(numbers)
          ^~~~~~~~~~~~~~

感谢您的帮助!

2 个答案:

答案 0 :(得分:17)

numbers: Int...中的sumOf参数称为可变参数。这意味着您可以传入可变数量的该类型的参数,并且您传入的所有内容都将转换为该类型的数组,供您在函数中使用。

因此,numbers内的average参数是一个数组,而不是sumOf所期望的一组参数。

您可能希望重载sumOf以接受其中任何一个,因此您的平均功能可以调用相应的版本:

func sumOf(numbers: [Int]) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}

答案 1 :(得分:0)

我可以通过将Int...替换为Int[]中的sumOf()来使其发挥作用。

func sumOf(numbers: Int[]) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

func average(numbers: Int...) -> Double {
    var sum = sumOf(numbers)

    return Double(sum) / Double(numbers.count)
}

average(3,4,5)

您的问题是Int...是可变数量的Ints而Int[]Int的数组。当调用sumOf时,它将参数转换为名为numbers的数组。然后尝试将该数组传递给sumOf,但是你已经写了它来获取可变数量的Ints而不是Ints数组。