Тип данных
Суть
Тип данных задаёт две вещи: множество допустимых значений и набор операций над ними. Int — целые от Int.min до Int.max плюс арифметика; Bool — два значения плюс &&, ||, !. Тип говорит компилятору, как интерпретировать байты в памяти и какие вызовы разрешены.
Система типов Swift
- Статическая — тип известен на этапе компиляции, ошибки ловятся до запуска.
- Строгая — нет неявных преобразований:
Int + Doubleне компилируется, нужноDouble(count). - С выводом типов — аннотацию можно опускать, компилятор выводит её сам.
- Базовые типы:
Int,Double,Float,Bool,String,Character; коллекцииArray,Dictionary,Set;Optional, кортежи, функции — тоже полноценные типы.
let count = 42 // Int — тип выведен компилятором
let ratio = 0.5 // Double
let flag = true // Bool
let name = "Swift" // String
let ch: Character = "S"
let maybe: Int? = nil // Optional<Int>
let total = Double(count) * ratio // преобразование только явное
Value vs reference — главное разделение
struct Money { var cents: Int } // value type
final class Account { var money = Money(cents: 0) } // reference type
var m1 = Money(cents: 100)
var m2 = m1
m2.cents = 5
print(m1.cents, m2.cents) // 100 5 — копия независима
let a1 = Account()
let a2 = a1
a2.money.cents = 7
print(a1.money.cents) // 7 — обе ссылки на один объект
struct, enum, все стандартные коллекции и String — value types: присваивание копирует значение (для коллекций — лениво, copy-on-write). class, actor, замыкания — reference types: копируется ссылка.
Optional и абстрактные типы
Optional<T> — это enum с кейсами .none и .some(T): отсутствие значения выражено в типе, а не через «магический» nil или 0. Разворачивать — через if let, guard let, ??, ?.; ! только когда nil действительно невозможен.
Абстрактный тип данных — интерфейс без реализации. В Swift это protocol: Collection описывает операции, а Array и Set реализуют их по-разному.