Ответ
Swift предоставляет богатый набор методов высшего порядка и утилит для работы с коллекциями (Array, Set, Dictionary).
Основные методы трансформации и фильтрации:
map(_:)– преобразует каждый элемент коллекции.filter(_:)– возвращает элементы, удовлетворяющие условию.reduce(_:_:)– объединяет все элементы в одно значение (например, сумму).compactMap(_:)– преобразует элементы, отфильтровываяnil.flatMap(_:)– преобразует и «разворачивает» вложенные коллекции в одну плоскую.forEach(_:)– выполняет действие для каждого элемента (без возврата нового массива).
Пример использования compactMap и map:
let numbers: [Int?] = [1, 2, nil, 4, nil, 6]
let squaredNumbers = numbers.compactMap { $0 }.map { $0 * $0 }
// Результат: [1, 4, 16, 36]
Другие полезные методы:
- Поиск и проверка:
contains(_:),first(where:),allSatisfy(_:). - Сортировка:
sorted(),sorted(by:). - Сегментация:
prefix(_:),suffix(_:),dropFirst(_:). - Группировка:
Dictionary(grouping:by:).
Использование этих методов делает код декларативным, читаемым и часто более эффективным за счет оптимизаций компилятора.
Ответ 18+ 🔞
А, ну вот, опять эти ваши коллекции, блядь! Swift, сука, как будто в детском саду для умных: нате вам кубики, только не простые, а с методами высшего порядка, ёпта! Смотри не перепутай, а то компилятор нахуй пошлёт.
Так, слушай сюда, не отвлекайся. Вот у тебя массив, да? Просто куча чисел или строк, или ещё какой хуйни. И ты с ними что-то сделать хочешь, но в лоб через for — это же, блядь, прошлый век, как будто на печатной машинке пишешь. Нет, ты должен это делать красиво, декларативно, блядь! Чтоб код сам за себя говорил: "Я, сука, элегантный, как хуй в смокинге!"
Основные приёмы для превращения твоего говнокода в конфетку:
map(_:)– Это как взять каждый элемент и пропустить через мясорубку, на выходе — фарш, но уже другой. Число умножил на два, строку в верхний регистр перевёл — хуяк, и новый массив готов.filter(_:)– А это сито, блядь. Просеиваешь коллекцию, оставляешь только то, что условие проходит. "Дай мне все чётные числа" — пожалуйста, получи, распишись. Остальное — в мусорку, нахуй не сдалось.reduce(_:_:)– Во, это мощь! Берёшь кучу всего и схлопываешь в одно значение. Как будто все элементы в одну точку сгребаешь. Сумму посчитать?reduce(0, +)— и всё, ебать ты ловкач! Сначала ноль, а потом плюсуй всё подряд.compactMap(_:)– О, это мой любимый, блядь! Особенно когда работаешь с опционалами, этими вечнымиnil, которые как гвозди в жопе. Метод берёт, преобразует, а если на выходеnil— выкидывает его нахуй, как сопляка из песочницы. Чистота!flatMap(_:)– Представь, у тебя массив массивов, матрёшка, блядь. Этот метод берёт и разворачивает всё в одну плоскую структуру. Все вложенности — к ебеням, получаем один сплошной поток.forEach(_:)– Просто пробежаться по всем, что-то сделать, но новый массив не возвращать. Типа "привет, я был здесь". Для сайд-эффектов, но осторожно, а то накосячишь.
Вот смотри, пример из жизни, чтоб не быть голословным, как пидарас:
let numbers: [Int?] = [1, 2, nil, 4, nil, 6]
let squaredNumbers = numbers.compactMap { $0 }.map { $0 * $0 }
// Результат: [1, 4, 16, 36]
Видишь, что произошло? Сначала compactMap отфильтровал все nil (просто взял $0, то есть значение, если оно есть). Эти nil — нахуй, их как не было. Остались [1, 2, 4, 6]. А потом map каждый оставшийся элемент возвёл в квадрат. Красота, в рот меня чих-пых! В две строчки, а сделано.
Ну и ещё немного всякой полезной хуйни, чтоб не лазить каждый раз в документацию:
- Поиск и проверка:
contains(_:)(есть ли такой?),first(where:)(найди первого, кто...),allSatisfy(_:)(все ли соответствуют условию?). - Сортировка:
sorted()(по умолчанию),sorted(by:)(по твоему хитрому правилу). - Отрезание кусков:
prefix(_:)(взять первые N),suffix(_:)(взять последние N),dropFirst(_:)(всё, кроме первых N). - Группировка:
Dictionary(grouping:by:)— вот это сила! Раскидал элементы по ключам, как карты по игрокам. Получил словарь, где ключ — твой критерий, а значение — массив подходящих элементов.
И вся эта красота, блядь, не просто для галочки. Код становится читаемым, как детская книжка (ну, почти). И компилятор это всё часто оптимизирует так, что по производительности ты если и проиграешь ручному for, то на овердохуища мелких долях секунды, которые ни одна собака не заметит. Так что не выёбывайся со своими циклами, учи матчасть!