Стандартная библиотека Swift (iOS/macOS): полный обзор
Стандартная библиотека Swift — это фундаментальный набор типов, протоколов и функций, встроенных непосредственно в язык. Она обеспечивает базовую функциональность, необходимую для разработки под iOS, macOS, watchOS и tvOS. В отличие от фреймворков Foundation или UIKit, которые являются частью SDK, стандартная библиотека Swift доступна сразу без дополнительных импортов. В этой статье мы подробно разберем её ключевые компоненты, структуры данных, протоколы и механизмы управления памятью.
Основные типы данных и коллекции
Swift предоставляет мощные и типобезопасные коллекции, оптимизированные для производительности.
Массивы (Array)
Упорядоченная коллекция элементов одного типа. Поддерживает произвольный доступ и динамическое изменение размера.
var numbers: [Int] = [1, 2, 3]
numbers.append(4)
let first = numbers[0] // 1
numbers.sort()
Множества (Set)
Неупорядоченная коллекция уникальных элементов. Идеальна для проверки принадлежности и математических операций.
let setA: Set<Int> = [1, 2, 3, 4]
let setB: Set<Int> = [3, 4, 5, 6]
let intersection = setA.intersection(setB) // {3, 4}
let union = setA.union(setB) // {1, 2, 3, 4, 5, 6}
Словари (Dictionary)
Неупорядоченная коллекция пар "ключ-значение". Ключи должны быть хешируемыми (Hashable).
var capitals: [String: String] = ["Россия": "Москва", "США": "Вашингтон"]
capitals["Германия"] = "Берлин"
if let russiaCapital = capitals["Россия"] {
print(russiaCapital) // Москва
}
Протоколы: основа универсальности Swift
Стандартная библиотека Swift построена на протоколах, которые определяют общий интерфейс для различных типов.
- Equatable — позволяет сравнивать экземпляры с помощью
==. - Hashable — требуется для использования типа в качестве ключа словаря или элемента множества.
- Comparable — даёт возможность упорядочивать объекты (<, >, <=, >=).
- Codable — объединяет Encodable и Decodable для сериализации в JSON, Property List и другие форматы.
- CaseIterable — автоматически предоставляет коллекцию всех значений перечисления.
Пример использования Codable
struct User: Codable {
let id: Int
let name: String
let isActive: Bool
}
let json = """
{
"id": 42,
"name": "Иван",
"isActive": true
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
if let user = try? decoder.decode(User.self, from: json) {
print(user.name) // Иван
}
Работа с памятью: ARC и Copy-on-Write
Swift использует Automatic Reference Counting (ARC) для управления памятью ссылочных типов (классов). Для структур и перечислений действует семантика копирования значения, но с оптимизацией Copy-on-Write (COW) для коллекций.
var array1 = [1, 2, 3]
var array2 = array1 // Пока не изменяем — данные общие
array2.append(4) // Здесь происходит реальное копирование (COW)
print(array1.count) // 3 — исходный массив не изменился
Универсальные шаблоны (Generics)
Generics позволяют писать гибкие и переиспользуемые функции и типы без потери производительности.
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
var x = 10
var y = 20
swapTwoValues(&x, &y) // x = 20, y = 10
Опциональные типы (Optionals)
Безопасная работа с отсутствующими значениями — одна из ключевых особенностей Swift. Опционалы предотвращают null-pointer исключения.
var optionalString: String? = "Привет"
// Optional binding
if let unwrapped = optionalString {
print(unwrapped.uppercased()) // ПРИВЕТ
}
// Nil-coalescing operator
let result = optionalString ?? "Значение по умолчанию"
Работа с числами и строками
Стандартная библиотека включает богатый набор инструментов для работы с числами (Int, Float, Double) и строками (String
Также в библиотеке
Resilience4j для Java: полное руководство с примерами
Кэширование в TypeScript: библиотека node-cache
Event Bus и паттерн Observer в JavaScript (Node.js) — создание гибких событийных систем
Glide/Coil для Kotlin: полное руководство с примерами