Разница между Int и Int[]

Почему следующее не удается скомпилировать (получение этого для ошибки: не удалось найти перегрузку для «_conversion», которая принимает предоставленные аргументы) при передаче Int...?

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

func averageOfInts(numbers: Int...) -> Int{
    var sumNums: Int = 0
    sumNums = sumOfNumbers(numbers)
    var count = numbers.count
    return sumOfNumbers(numbers)/numbers.count
}

Но когда Int[] используется вместо Int... он компилируется и работает как положено.


person ascarb    schedule 24.06.2014    source источник


Ответы (2)


Когда тип аргумента Int..., все последующие аргументы объединяются в массив для вас, тогда как Int[] требует, чтобы вы передали только один аргумент, массив целых чисел:

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

использование

sumOfIntsSplat(1,2,3,4,5)
sumOfIntsArray([1,2,3,4,5])

Синтаксис Int... называется Параметр Variadic в документации Swift

(в сторону: я позаимствовал название «splat» из coffeescript, где впервые столкнулся с этим синтаксисом)

person Jiaaro    schedule 24.06.2014
comment
Настоящая проблема здесь заключается в том, что Int[] и Int... не могут быть преобразованы друг в друга (пока), и в настоящее время нет способа передать массив параметру с переменным числом переменных. - person Sulthan; 24.06.2014
comment
@Султан, я полностью согласен - person Jiaaro; 24.06.2014

Int... означает один или несколько параметров типа Int.

Как сумма (3,4,5,6)

Хотя Int[] означает один параметр, который содержит Ints. (как массив)

Как сумма ([3,4,5,6])

person Lord Zsolt    schedule 24.06.2014