Передача списков из одной функции в другую в Swift

Я не могу понять, почему я не могу пройти 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)
          ^~~~~~~~~~~~~~

Спасибо за вашу помощь!

Ответ 1

Параметр 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)
}

Ответ 2

Мне удалось заставить его работать, заменив 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 вызывается, он превращает параметры в массивы, называемые номерами. Затем вы пытаетесь передать этот массив в sumOf, но вы написали его, чтобы принять переменное количество интов вместо массива интов.