Какие методы для работы с коллекциями в Swift ты знаешь?

Ответ

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, то на овердохуища мелких долях секунды, которые ни одна собака не заметит. Так что не выёбывайся со своими циклами, учи матчасть!