Введение и проблематика
Типы данных — основа любого языка программирования. Swift предоставляет набор базовых типов, оптимизированных для безопасности и производительности. Понимание этих типов необходимо для эффективной работы с языком.
Swift — type-safe язык. Это означает, что компилятор проверяет соответствие типов на этапе компиляции, предотвращая множество ошибок.
Целые числа (Int)
Основной тип Int
let age: Int = 25
let count = 100 // Type inference → Int
let negative = -50
Int — знаковый целочисленный тип. Его размер зависит от платформы:
- На 32-битных платформах: Int32 (от -2,147,483,648 до 2,147,483,647)
- На 64-битных платформах: Int64 (от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807)
Специфичные размеры
let int8: Int8 = 127 // -128 до 127
let int16: Int16 = 32767 // -32,768 до 32,767
let int32: Int32 = 2147483647
let int64: Int64 = 9223372036854775807
Беззнаковые целые (UInt)
let positive: UInt = 100 // Только положительные
let byte: UInt8 = 255 // 0 до 255
⚠️
Используйте Int по умолчанию, даже если значения неотрицательные. Это обеспечивает совместимость и избавляет от лишних преобразований.
Границы типов
❓
Code Example 1: Что выведет этот код?
print("Int8 range: \(Int8.min) to \(Int8.max)")
print("UInt8 range: \(UInt8.min) to \(UInt8.max)")
Числа с плавающей точкой
Double (рекомендуется)
let pi: Double = 3.14159265358979
let height = 1.75 // Type inference → Double
Double — 64-битное число с точностью минимум 15 значащих цифр.
Float
let temperature: Float = 36.6
Float — 32-битное число с точностью около 6 значащих цифр.
Swift по умолчанию выводит Double для чисел с плавающей точкой. Используйте Float только когда точность не критична или требуется совместимость с API.
Сравнение точности
❓
Code Example 2: Почему результаты отличаются?
let floatValue: Float = 1.123456789
let doubleValue: Double = 1.123456789
print(floatValue) // 1.1234568
print(doubleValue) // 1.123456789
Строки (String)
Объявление строк
let greeting = "Hello, World!"
let empty = ""
let multiline = """
This is a
multiline string
"""
Основные операции
let firstName = "John"
let lastName = "Doe"
// Конкатенация
let fullName = firstName + " " + lastName
// Проверка на пустоту
if greeting.isEmpty {
print("Empty string")
}
// Длина строки
print(greeting.count) // 13
Интерполяция строк
let name = "Swift"
let version = 5
let message = "Welcome to \(name) \(version)!"
Логический тип (Bool)
Базовое использование
let isActive = true
let isComplete: Bool = false
В условиях
❓
Code Example 3: Какой будет вывод?
let hasAccess = true
let isAdmin = false
if hasAccess && !isAdmin {
print("Regular user")
} else if hasAccess && isAdmin {
print("Admin")
} else {
print("No access")
}
⚠️
В Swift нельзя использовать числа вместо Bool в условиях. Код if 1 { } вызовет ошибку компиляции.
Character
Отдельный символ
let letter: Character = "A"
let emoji: Character = "🎉"
let heart: Character = "\u{2665}" // ♥
Итерация по строке
for char in "Swift" {
print(char) // S, w, i, f, t
}
Type Safety и Type Inference
Автоматический вывод типов
let meaningOfLife = 42 // Int
let pi = 3.14159 // Double
let greeting = "Hello" // String
let isSwiftAwesome = true // Bool
Явное приведение типов
Swift не выполняет неявное преобразование:
❓
Code Example 4: Как исправить эту ошибку?
let intValue = 10
let doubleValue = 3.5
// let result = intValue + doubleValue // Ошибка!
let result = Double(intValue) + doubleValue // OK: 13.5
Сравнительная таблица
| Тип | Размер | Диапазон/Описание | Пример |
|---|
| Int | 32/64 бита | Платформозависимый | let x = 42 |
| Int8 | 8 бит | -128 до 127 | let x: Int8 = 100 |
| UInt | 32/64 бита | 0 до макс. | let x: UInt = 42 |
| Float | 32 бита | ~6 знаков точности | let x: Float = 3.14 |
| Double | 64 бита | ~15 знаков точности | let x = 3.14159 |
| Bool | 1 бит | true/false | let x = true |
| String | Переменный | Unicode текст | let x = "Hi" |
| Character | Переменный | Один символ | let x: Character = "A" |
Вопросы интервьюера
Q: Почему Swift использует Double по умолчанию, а не Float?
Double обеспечивает большую точность (15 vs 6 значащих цифр) при незначительном увеличении потребления памяти. На современных 64-битных процессорах операции с Double так же быстры, как с Float.
Q: Что произойдёт при переполнении Int?
В release-сборке — undefined behavior. В debug-сборке — crash. Для безопасной арифметики используйте addingReportingOverflow, &+, &-.
Q: Как проверить тип переменной?
Используйте type(of: variable) для получения типа в runtime.
Q: Можно ли создать пустой Character?
Нет, Character должен содержать ровно один символ. Для пустого значения используйте Optional: let c: Character? = nil.
Источники