Swift предоставляет три основных типа коллекций, каждый из которых имеет свои особенности и варианты использования:
1. Array - упорядоченная коллекция
Характеристики:
- Сохраняет порядок элементов
- Доступ по индексу (начиная с 0)
- Может содержать дубликаты
- Элементы одного типа
Примеры:
// Создание
var numbers: [Int] = [1, 2, 3]
var names = ["Anna", "Alex"] // тип выводится как [String]
// Доступ
let firstNumber = numbers[0] // 1
// Модификация
numbers.append(4)
numbers.insert(0, at: 0)
numbers.remove(at: 1)
Особенности:
- Высокая производительность для операций в конце (O(1))
- Средняя производительность для вставки/удаления в середине (O(n))
2. Set - неупорядоченная уникальная коллекция
Характеристики:
- Не сохраняет порядок элементов
- Все элементы уникальны
- Быстрый поиск элемента
- Элементы должны быть Hashable
Примеры:
// Создание
var letters = Set<Character>()
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// Операции
favoriteGenres.insert("Jazz")
favoriteGenres.remove("Rock")
// Проверка принадлежности
if favoriteGenres.contains("Funk") {
print("Есть!")
}
Особенности:
- Крайне быстрый поиск (O(1))
- Поддержка математических операций:
let union = setA.union(setB) // объединение
let intersection = setA.intersection(setB) // пересечение
3. Dictionary - коллекция пар "ключ-значение"
Характеристики:
- Неупорядоченная коллекция
- Ключи должны быть Hashable
- Быстрый доступ по ключу
- Каждый ключ уникален
Примеры:
// Создание
var namesOfIntegers: [Int: String] = [:]
var airports = ["YYZ": "Toronto", "DUB": "Dublin"]
// Доступ и модификация
airports["LHR"] = "London" // добавление
airports["LHR"] = "London Heathrow" // изменение
if let removedValue = airports.removeValue(forKey: "DUB") {
print("Удален \(removedValue)")
}
Особенности:
- Быстрый доступ к значениям по ключу (O(1))
- Удобен для хранения ассоциативных данных
Специальные виды коллекций
1. Range
let closedRange = 1...5 // включая 5
let halfOpenRange = 1..<5 // не включая 5
2. Slice
let array = [1, 2, 3, 4, 5]
let slice = array[1..<3] // [2, 3]
3. NSCountedSet
- Set с подсчетом количества элементов
let countedSet = NSCountedSet()
countedSet.add("Apple")
countedSet.add("Apple")
countedSet.count(for: "Apple") // 2
Протоколы коллекций
Swift коллекции построены на иерархии протоколов:
- Sequence - базовый протокол для итерируемых типов
- Collection - наследует Sequence, добавляет индексы и доступ по индексу
- BidirectionalCollection - добавляет возможность итерирования в обратном порядке
- RandomAccessCollection - быстрый произвольный доступ
Производительность операций
Коллекция | Доступ | Поиск | Вставка | Удаление |
Array | O(1) | O(n) | O(n) | O(n) |
Set | - | O(1) | O(1) | O(1) |
Dictionary | O(1) | O(1) | O(1) | O(1) |
Примеры выбора коллекции
- Нужен порядок? → Array
- Уникальность элементов? → Set
- Ассоциативное хранение? → Dictionary
- Частый поиск? → Set или Dictionary
Резюмируем
Основные типы коллекций в Swift:
- Array - упорядоченные списки
- Set - неупорядоченные уникальные элементы
- Dictionary - пары ключ-значение
Дополнительные типы:
- Range, Slice, NSCountedSet
Выбор коллекции зависит от:
- Необходимости сохранять порядок
- Требований к уникальности элементов
- Частоты операций поиска/вставки
- Необходимости ассоциативного доступа