Parameter packs: одна функция на любое число аргументов 📦

🎁 each T плюс repeat (SE-0393 / SE-0398 / SE-0399, Swift 5.9) убирают лестницу перегрузок на 2, 3, 4 аргумента. Одна сигнатура работает с любым их количеством и сохраняет типы.

⚠️ И вот здесь важное. Тот самый вариадический zip, который кочует из статьи в статью как показательный пример, не компилируется. Он взят почти дословно из SE-0408 — из раздела Future directions, то есть из нереализованного. Что именно ломается: (repeat (each iterators).next()) даёт кортеж Optional'ов, а не Optional от кортежа, поэтому while letразворачивать нечего. Плюс SE-0399 разворачивает выражение через неизменяемую копию, вычисленную один раз, так что вызвать mutating next() на each iterators нельзя. Мутабельной проекции элементов пакета в языке пока нет. Ещё две вещи, которые стоит знать. Пакет — не значение первого класса: его нельзя сохранить, посчитать или проитерировать напрямую, он существует только внутри repeat-паттерна (итерация появилась отдельно, в SE-0408, Swift 6.0). И если пакет подставляется одним элементом, скобки вокруг (repeat each T) снимаются — однокортежей в Swift нет, а пустой пакет схлопывается в Void.

#Swift #Swift5_9 #Generics #AdvancedSwift #iOSDevelopment

Parameter packs: одна функция на любое число аргументов 📦 | Сетка — социальная сеть от hh.ru