В языке программирования Swift говорится:
Функции также могут принимать переменное количество аргументов, собирая их в массив.
func sumOf(numbers: Int...) -> Int { ... }
Когда я вызываю такую функцию с разделенным запятыми списком чисел (`sumOf (1, 2, 3, 4)), они становятся доступными в виде массива внутри функции.
Вопрос: что если у меня уже есть массив чисел, который я хочу передать этой функции?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
Это приводит к ошибке компилятора: «Не удалось найти перегрузку для« __conversion », которая принимает предоставленные аргументы». Есть ли способ превратить существующий массив в список элементов, которые я могу передать в функцию с переменным числом аргументов?
swift
variadic-functions
Оле Бегеманн
источник
источник
Ответы:
Splatting еще не в языке , что подтверждается разработчиками. Обходной путь на данный момент заключается в использовании перегрузки или ожидания, если вы не можете добавить перегрузки.
источник
sumOf(...numbers)
print
!Вот работа, которую я нашел. Я знаю, что это не совсем то, что вы хотите, но, похоже, работает.
Шаг 1: Объявите функцию, которую вы хотите, с массивом вместо переменных аргументов:
Шаг 2: Вызовите это из своей функции вариации:
Шаг 3: Звоните в любую сторону:
Это кажется странным, но это работает в моих тестах. Дайте мне знать, если это приведет к непредвиденным проблемам для кого-либо. Swift, кажется, способен разделить разницу между двумя вызовами с одинаковым именем функции.
Кроме того, с помощью этого метода, если Apple обновляет язык в соответствии с ответом @ manojid, вам нужно будет только обновить эти функции. В противном случае вам придется пройти и сделать много переименований.
источник
Вы можете разыграть функцию:
источник
func sumOf(foo numbers: Int..., bar: Bool) -> Int {};
требуетсяtypealias Function = (foo: [Int], bar: Bool) -> Int;
unsafeBitCast
. Это может работать сегодня, но если ссылка не говорит об этом, следующая версия компилятора может делать здесь буквально все, что угодно (ошибка компилятора / сбой / случайное выполнение кода ...). Посмотрите на серьезное предупреждение на unsafeBitCast .Вы можете использовать вспомогательную функцию как таковую:
источник
Int...
и не может (легко) быть изменена?apply
процедуру. Я полагаю, некоторые люди называют это "плескаться".sumArray
здесь ссылаются?Я знаю, что этот ответ не отвечает на ваш точный вопрос, но я чувствую, что стоит отметить. Я тоже начал играть со Свифтом и сразу столкнулся с похожим вопросом. Ответ Манойлда лучше на ваш вопрос, я согласен, но, опять же, я нашел другой обходной путь. Мне тоже нравится Логан.
В моем случае я просто хотел передать массив:
Просто хотел поделиться, на случай, если кто-то еще подумает, как я. Большую часть времени я бы предпочел передать массив таким образом, но пока не думаю, что это «быстро». :)
источник
Я сделал это (Wrapper + Identity Mapping):
источник
Swift 5
Это подход с
@dynamicCallable
функцией, которая позволяет избежать перегрузки или жеunsafeBitCast
вы должны сделать конкретныйstruct
вызов:источник