Передача списков из одной функции в другую в 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, но вы написали его, чтобы принять переменное количество интов вместо массива интов.