Как выполнить итерацию по коллекции в Swift?

Ответ

Да, в Swift можно итерироваться по коллекциям (массивам, словарям, множествам) несколькими способами.

Основные методы:

  1. Цикл for-in (универсальный):

    let numbers = [1, 2, 3]
    for number in numbers {
    print(number)
    }
  2. Методы высшего порядка (функциональный стиль):

    numbers.forEach { print($0) } // Проход по элементам
    let doubled = numbers.map { $0 * 2 } // Преобразование
    let even = numbers.filter { $0 % 2 == 0 } // Фильтрация
  3. Итерация по словарю:

    let dict = ["a": 1, "b": 2]
    for (key, value) in dict {
    print("(key): (value)")
    }

Важные особенности:

  • Порядок итерации в Dictionary и Set не гарантирован (используйте .sorted() для порядка)
  • Для безопасной модификации во время итерации используйте:
    for index in numbers.indices.reversed() {
    if numbers[index] == 2 {
        numbers.remove(at: index)
    }
    }
  • Метод enumerated() возвращает пары (индекс, элемент) для массивов

Ответ 18+ 🔞

О, смотри-ка, какой у нас тут академический разговор про итерацию в Swift подъехал. Ну что ж, давайте разберём эту хуйню, но без зауми, как есть.

Вот смотри, чтобы по коллекциям шастать, у тебя есть несколько путей, и не все они одинаково полезны в разных ситуациях, понимаешь?

Самый простой и понятный, как палка обоссаная — цикл for-in:

let numbers = [1, 2, 3]
for number in numbers {
    print(number)
}

Всё, блядь. Проще некуда. Взял и прошёлся. Если у тебя массив — будет по порядку. Если словарь или множество — готовься к сюрпризам, порядок там нихуя не гарантирован, как пьяный ёжик в тумане.

Дальше идут эти ваши модные «функциональные» штуки. Высшим порядком пахнет, да? forEach, map, filter. Выглядит красиво, иногда даже удобно.

numbers.forEach { print($0) } // Просто делаем что-то с каждым элементом, без возврата. По сути, тот же for-in, но в профиль.
let doubled = numbers.map { $0 * 2 } // Тут мы каждый элемент преобразуем. Взял, умножил на два — получил новый массив. Магия, блядь.
let even = numbers.filter { $0 % 2 == 0 } // А это фильтрация. Оставляет только те элементы, где условие `true`. Всё остальное — в пизду.

Теперь про словари. Тут, сука, важно помнить, что идёшь ты по парам «ключ-значение».

let dict = ["a": 1, "b": 2]
for (key, value) in dict {
    print("(key): (value)")
}

И опять же — порядок вывода может быть любой. Хочет — "a": 1 сначала, хочет — "b": 2. Если тебе нужен конкретный порядок, например, по алфавиту ключей, то пристегни .sorted().

А теперь, внимание, важный момент, про который многие забывают, а потом охуевают! Нельзя просто так, с бухты-барахты, удалять элементы из коллекции, по которой ты в данный момент итерируешься. Компилятор тебе мозги выест. Для этого есть специальные приёмы.

Например, если нужно удалить элементы из массива прямо во время прохода, иди с конца, чтобы индексы не съехали, как говно по асфальту:

var numbers = [1, 2, 3, 2, 5]
for index in numbers.indices.reversed() {
    if numbers[index] == 2 {
        numbers.remove(at: index)
    }
}

Вот так безопасно. А то удалишь элемент в начале — и всё, пиздец, индексы полетели, обращение к несуществующему элементу, краш приложения. Волнение ебать.

Ну и enumerated() не забывай, если вместе с элементом нужен его индекс в массиве. Возвращает кортежи (индекс, элемент). Удобная штука, когда позиция имеет значение.

В общем, инструментов — овердохуища. Выбирай по ситуации и не усложняй там, где можно просто.