Ответ
Да, в Swift можно итерироваться по коллекциям (массивам, словарям, множествам) несколькими способами.
Основные методы:
-
Цикл
for-in(универсальный):let numbers = [1, 2, 3] for number in numbers { print(number) } -
Методы высшего порядка (функциональный стиль):
numbers.forEach { print($0) } // Проход по элементам let doubled = numbers.map { $0 * 2 } // Преобразование let even = numbers.filter { $0 % 2 == 0 } // Фильтрация -
Итерация по словарю:
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() не забывай, если вместе с элементом нужен его индекс в массиве. Возвращает кортежи (индекс, элемент). Удобная штука, когда позиция имеет значение.
В общем, инструментов — овердохуища. Выбирай по ситуации и не усложняй там, где можно просто.