Ответ
Swift предоставляет три основные универсальные (generic) коллекции, каждая со своей семантикой и синтаксисом типа:
| Коллекция | Назначение | Синтаксис типа (полный / краткий) | Пример инициализации |
|---|---|---|---|
| Array | Упорядоченная коллекция с индексами. | Array<Element> или [Element] |
let numbers: [Int] = [1, 2, 3] |
| Set | Неупорядоченная коллекция уникальных значений. | Set<Element> |
let tags: Set<String> = ["swift", "ios", "apple"] |
| Dictionary | Неупорядоченная коллекция пар ключ-значение. | Dictionary<Key, Value> или [Key: Value] |
let capitals: [String: String] = ["FR": "Paris"] |
Ключевые технические детали:
- Value-семантика: Все три коллекции являются типами-значениями. При присваивании или передаче в функцию копируется их содержимое (с оптимизацией COW — Copy-on-Write).
- Соответствие протоколам: Все они соответствуют протоколу
Collection, который обеспечивает базовый интерфейс для итерации.Arrayтакже соответствуетRandomAccessCollection(быстрый доступ по индексу).SetсоответствуетSetAlgebraдля операций вроде объединения и пересечения.
- Ограничения типов:
- Тип
ElementдляSetдолжен соответствовать протоколуHashable. - Тип
KeyдляDictionaryтакже должен бытьHashable.
- Тип
Пример использования с дженериками:
// Функция, работающая с любой коллекцией, содержащей целые числа
func sumOfElements<C: Collection>(_ collection: C) -> Int where C.Element == Int {
return collection.reduce(0, +)
}
let arr: [Int] = [1, 2, 3]
let set: Set<Int> = [4, 5, 6]
print(sumOfElements(arr)) // 6
print(sumOfElements(set)) // 15