iOS Mobile Инженер

iOS Mobile Инженер

Роадмап навыков для прокачки

Базовые типы данных: Int, Double, String, Bool

SwiftОсновыСинтаксис и основы

Основная идея

Swift — строго типизированный язык с базовыми типами данных: Int для целых чисел, Double для чисел с плавающей точкой, String для текста и Bool для логических значений. Каждый тип имеет фиксированный размер и набор операций.

Ключевые аспекты

  • Int — целые числа (размер зависит от платформы: 32 или 64 бита)
  • Double — числа с плавающей точкой двойной точности (64 бита)
  • Float — числа с плавающей точкой одинарной точности (32 бита)
  • String — последовательность Unicode-символов
  • Bool — логический тип с двумя значениями: true и false
  • Character — один Unicode-символ

Особенности Swift

  • Type safety — нельзя присвоить значение несовместимого типа
  • Type inference — компилятор автоматически определяет тип
  • Нет неявного приведения типов — требуется явная конвертация
  • Все типы начинаются с заглавной буквы

Размеры числовых типов

  • Int8, Int16, Int32, Int64 — знаковые целые
  • UInt8, UInt16, UInt32, UInt64 — беззнаковые целые
  • Float (32 бита) vs Double (64 бита)

Частые ошибки на собеседованиях

  • Путают Float и Double (в Swift по умолчанию Double)
  • Забывают о необходимости явного приведения типов
  • Не знают про Character как отдельный тип
  • Считают, что Int всегда 32-битный (зависит от платформы)

Введение и проблематика

Типы данных — основа любого языка программирования. Swift предоставляет набор базовых типов, оптимизированных для безопасности и производительности. Понимание этих типов необходимо для эффективной работы с языком.

Swift — type-safe язык. Это означает, что компилятор проверяет соответствие типов на этапе компиляции, предотвращая множество ошибок.


Целые числа (Int)

Основной тип Int

swift
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)

Специфичные размеры

swift
let int8: Int8 = 127         // -128 до 127
let int16: Int16 = 32767     // -32,768 до 32,767
let int32: Int32 = 2147483647
let int64: Int64 = 9223372036854775807

Беззнаковые целые (UInt)

swift
let positive: UInt = 100     // Только положительные
let byte: UInt8 = 255        // 0 до 255
⚠️

Используйте Int по умолчанию, даже если значения неотрицательные. Это обеспечивает совместимость и избавляет от лишних преобразований.

Границы типов

Code Example 1: Что выведет этот код?

swift
print("Int8 range: \(Int8.min) to \(Int8.max)")
print("UInt8 range: \(UInt8.min) to \(UInt8.max)")

Числа с плавающей точкой

Double (рекомендуется)

swift
let pi: Double = 3.14159265358979
let height = 1.75  // Type inference → Double

Double — 64-битное число с точностью минимум 15 значащих цифр.

Float

swift
let temperature: Float = 36.6

Float — 32-битное число с точностью около 6 значащих цифр.

Swift по умолчанию выводит Double для чисел с плавающей точкой. Используйте Float только когда точность не критична или требуется совместимость с API.

Сравнение точности

Code Example 2: Почему результаты отличаются?

swift
let floatValue: Float = 1.123456789
let doubleValue: Double = 1.123456789
 
print(floatValue)   // 1.1234568
print(doubleValue)  // 1.123456789

Строки (String)

Объявление строк

swift
let greeting = "Hello, World!"
let empty = ""
let multiline = """
    This is a
    multiline string
    """

Основные операции

swift
let firstName = "John"
let lastName = "Doe"
 
// Конкатенация
let fullName = firstName + " " + lastName
 
// Проверка на пустоту
if greeting.isEmpty {
    print("Empty string")
}
 
// Длина строки
print(greeting.count)  // 13

Интерполяция строк

swift
let name = "Swift"
let version = 5
let message = "Welcome to \(name) \(version)!"

Логический тип (Bool)

Базовое использование

swift
let isActive = true
let isComplete: Bool = false

В условиях

Code Example 3: Какой будет вывод?

swift
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

Отдельный символ

swift
let letter: Character = "A"
let emoji: Character = "🎉"
let heart: Character = "\u{2665}"  // ♥

Итерация по строке

swift
for char in "Swift" {
    print(char)  // S, w, i, f, t
}

Type Safety и Type Inference

Автоматический вывод типов

swift
let meaningOfLife = 42        // Int
let pi = 3.14159              // Double
let greeting = "Hello"        // String
let isSwiftAwesome = true     // Bool

Явное приведение типов

Swift не выполняет неявное преобразование:

Code Example 4: Как исправить эту ошибку?

swift
let intValue = 10
let doubleValue = 3.5
 
// let result = intValue + doubleValue  // Ошибка!
let result = Double(intValue) + doubleValue  // OK: 13.5

Сравнительная таблица

ТипРазмерДиапазон/ОписаниеПример
Int32/64 битаПлатформозависимыйlet x = 42
Int88 бит-128 до 127let x: Int8 = 100
UInt32/64 бита0 до макс.let x: UInt = 42
Float32 бита~6 знаков точностиlet x: Float = 3.14
Double64 бита~15 знаков точностиlet x = 3.14159
Bool1 битtrue/falselet 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.


Источники

Code Example 1: Границы числовых типов

❓ Что выведет этот код?

swift
print("Int8 range: \(Int8.min) to \(Int8.max)")
print("UInt8 range: \(UInt8.min) to \(UInt8.max)")

Code Example 2: Точность Float vs Double

❓ Почему результаты отличаются?

swift
let floatValue: Float = 1.123456789
let doubleValue: Double = 1.123456789
 
print(floatValue)
print(doubleValue)

Code Example 3: Логические операции

❓ Какой будет вывод?

swift
let hasAccess = true
let isAdmin = false
 
if hasAccess && !isAdmin {
    print("Regular user")
} else if hasAccess && isAdmin {
    print("Admin")
} else {
    print("No access")
}

Code Example 4: Приведение типов

❓ Почему закомментированная строка вызывает ошибку и как её исправить?

swift
let intValue = 10
let doubleValue = 3.5
 
// let result = intValue + doubleValue