Какие структуры данных есть в Swift?ios-14

Основные структуры данных

1. Array

Линейная коллекция элементов с индексами:

var numbers = [1, 2, 3]
numbers.append(4) // [1, 2, 3, 4]
let first = numbers[0] // 1
  • Плюсы: Быстрый доступ по индексу (O(1))
  • Минусы: Вставка/удаление в середину - O(n)

2. Set

Уникальные неупорядоченные элементы:

var uniqueNumbers: Set = [1, 2, 3, 3] // [1, 2, 3]
uniqueNumbers.insert(4) // [1, 2, 3, 4]
  • Плюсы: Проверка наличия элемента - O(1)
  • Минусы: Нет порядка элементов

3. Dictionary

Пары ключ-значение:

var userInfo = ["name": "John", "age": 30]
userInfo["email"] = "john@example.com"
  • Плюсы: Быстрый доступ по ключу - O(1)
  • Минусы: Нет гарантии порядка элементов

4. String

Последовательность символов:

let greeting = "Hello"
let count = greeting.count // 5
  • Особенности: Поддерживает Unicode, сложность O(n) для .count

Специализированные структуры

5. Stack

Реализация стека на массиве:

struct Stack<Element> {
    private var elements = [Element]()
    mutating func push(_ element: Element) {
        elements.append(element)
    }
    mutating func pop() -> Element? {
        return elements.popLast()
    }
}

6. Queue

Реализация очереди:

struct Queue<Element> {
    private var elements = [Element]()
    mutating func enqueue(_ element: Element) {
        elements.append(element)
    }
    mutating func dequeue() -> Element? {
        return elements.isEmpty ? nil : elements.removeFirst()
    }
}

7. Linked List

Пример односвязного списка:

class Node<T> {
    var value: T
    var next: Node?
    init(value: T) { self.value = value }
}

Foundation-структуры

8. NSCountedSet

Множество с подсчетом элементов:

let countedSet = NSCountedSet()
countedSet.add("apple")
countedSet.add("apple")
countedSet.count(for: "apple") // 2

9. NSOrderedSet

Упорядоченное множество:

let ordered = NSOrderedSet(array: [3, 1, 2, 1])
ordered.array // [3, 1, 2]

Выбор структуры данных

СтруктураИспользуйте когда...Средняя сложность доступа
Array Нужен порядок или частый доступ по индексу O(1)
Set Важна уникальность и быстрая проверка наличия O(1)
Dictionary Нужен доступ по уникальному ключу O(1)
Stack Нужен LIFO принцип O(1) для push/pop
Queue Нужен FIFO принцип O(n) для dequeue

Резюмируем:

Swift предлагает богатый набор структур данных как из стандартной библиотеки, так и из Foundation. Выбор зависит от конкретной задачи: нужен ли порядок элементов, важна ли уникальность, требуются ли частые вставки/удаления. Для сложных сценариев можно создавать собственные структуры на основе базовых.