Какие типы коллекций существуют в Swift

В Swift коллекции представляют собой типы, которые позволяют хранить несколько значений одного или разных типов в едином контейнере. Коллекции являются фундаментальной частью языка и широко используются во всех уровнях разработки — от простых алгоритмов до построения UI и хранения данных.

Swift предлагает три основных типа коллекций:

  1. Array — упорядоченная последовательность значений

  2. Set — неупорядоченное множество уникальных значений

  3. Dictionary — коллекция пар "ключ-значение"

🔢 Array

Общая характеристика:

  • Упорядоченная коллекция.

  • Позволяет дублирующие элементы.

  • Доступ по индексу: O(1).

  • Элементы индексируются с нуля.

  • Тип: Array<Element> или [Element].

Объявление:

var numbers: \[Int\] = \[1, 2, 3\]
var strings = \["one", "two", "three"\]

Особенности:

  • Поддерживает множество методов: append, insert, remove, sort, map, filter, reduce.

  • При добавлении за пределами текущей ёмкости создаётся новая копия (Copy-on-Write).

  • Можно инициализировать пустым: var list = [String]()

  • Может быть многомерным: [[Int]] — двумерный массив.

Пример:

var fruits = \["Apple", "Banana"\]
fruits.append("Mango")
let first = fruits\[0\] // "Apple"

🔘 Set

Общая характеристика:

  • Неупорядоченное множество.

  • Все элементы уникальны.

  • Доступ к элементу: O(1) в среднем.

  • Тип: Set<Element>

Объявление:

var tags: Set&lt;String&gt; = \["swift", "ios", "xcode"\]

Особенности:

  • Использует хеш-таблицу.

  • Элемент должен быть Hashable (напр. Int, String, Enum, Struct с Hashable).

  • Методы: insert, remove, contains, union, intersection, subtracting.

Пример:

var uniqueNumbers: Set = \[1, 2, 3\]
uniqueNumbers.insert(2) // Не будет добавлен
uniqueNumbers.contains(3) // true

🧾 Dictionary

Общая характеристика:

  • Хранит пары "ключ — значение".

  • Ключи должны быть уникальными.

  • Использует хеширование ключей.

  • Доступ к значению по ключу: O(1) в среднем.

  • Тип: Dictionary<Key, Value> или [Key: Value]

Объявление:

var capitals: \[String: String\] = \[
"France": "Paris",
"Japan": "Tokyo"
\]

Особенности:

  • Ключи должны быть Hashable.

  • Методы: updateValue, removeValue, merge, mapValues, filter.

  • Можно итерировать по keys, values, items.

Пример:

capitals\["Germany"\] = "Berlin"
let city = capitals\["France"\] // "Paris"

📐 Расширенные коллекции и структуры

Range

  • Представляет диапазон значений.

  • Может быть закрытым (1...5) или полуоткрытым (1..<5).

  • Используется для индексации, цикла и генерации диапазонов.

for i in 1...3 {
print(i)
}

Stride

  • Позволяет шагать по числовым диапазонам с шагом.

  • stride(from:to:by:), stride(from:through:by:).

for angle in stride(from: 0, through: 360, by: 90) {
print(angle)
}

📂 Коллекции по протоколам

Swift коллекции реализуют множество протоколов, определяющих их поведение:

Sequence

  • Основной протокол последовательностей.

  • Обеспечивает итерацию через for-in.

  • Обязателен метод makeIterator().

let sequence = \[1, 2, 3\]
for num in sequence {
print(num)
}

Collection

  • Расширяет Sequence.

  • Определяет индексы, доступ по индексу, длину и навигацию.

  • Требует свойств: startIndex, endIndex, index(after:).

BidirectionalCollection

  • Позволяет двигаться назад: index(before:).

  • Пример: Array, String.

RandomAccessCollection

  • Поддерживает произвольный доступ к элементам: O(1).

  • Позволяет сравнивать производительность и выбирать алгоритмы в зависимости от коллекции.

MutableCollection

  • Позволяет изменять элементы по индексу.
var numbers = \[1, 2, 3\]
numbers\[0\] = 10

🧠 Copy-on-Write (COW) в коллекциях

Коллекции в Swift используют механизм Copy-on-Write:

  • При копировании коллекции объект не дублируется сразу.

  • Если копия не изменяется, она разделяет память с оригиналом.

  • Если копия модифицируется, создаётся новая память.

Это позволяет эффективно использовать память и при этом сохранить семантику значений (value semantics).

🔄 Высокоуровневые методы работы с коллекциями

Swift предоставляет функциональные методы:

  • map: преобразует элементы

  • filter: фильтрует по условию

  • reduce: сворачивает в одно значение

  • sorted, reversed, prefix, suffix, drop

Пример:

let numbers = \[1, 2, 3, 4\]
let squares = numbers.map { $0 \* $0 } // \[1, 4, 9, 16\]
let even = numbers.filter { $0 % 2 == 0 } // \[2, 4\]
let sum = numbers.reduce(0, +) // 10

🧱 Специализированные коллекции

ArraySlice

  • Представляет часть массива без копирования данных.

  • Используется при разделении: array[1..<4]

IndexSet

  • Оптимизированный способ хранения множества целых индексов.
let indexes = IndexSet(\[1, 2, 3\])

OrderedDictionary (из Swift Collections)

  • Коллекция, которая сохраняет порядок ключей.

  • Доступна через пакет swift-collections.

🧰 Коллекции и обобщения

Swift коллекции обобщены (generic), что позволяет создавать универсальные структуры данных:

struct Stack&lt;T&gt; {
private var items: \[T\] = \[\]
mutating func push(_ item: T) {
items.append(item)
}
mutating func pop() -> T? {
return items.popLast()
}
}

Это позволяет использовать тип Stack<Int>, Stack<String> и т. д.

🔒 Коллекции и безопасность типов

Swift строго типизирован: коллекции всегда содержат только элементы одного типа. Это позволяет избежать ошибок времени выполнения и использовать весь потенциал компилятора и автодополнения.

let names: \[String\] = \["Alice", "Bob"\]
// names.append(42) // Ошибка компиляции

🧪 Итерирование по коллекциям

Можно использовать:

  • for-in

  • forEach

  • enumerated()

  • indices

  • zip

Пример с индексами:

for (index, value) in array.enumerated() {
print("\\(index): \\(value)")
}

Все коллекции в Swift проектируются так, чтобы быть:

  • безопасными,

  • предсказуемыми,

  • быстрыми,

  • легко читаемыми и модифицируемыми.