Основы Swift: синтаксис, опционалы и структуры
Основы4 минРедакция Innovialabs
Коротко
В Swift сначала стоит освоить пять вещей: let/var, опционалы с безопасной распаковкой, разницу между struct (значение) и class (ссылка), enum и замыкания — на них держится почти весь код под iOS.
Что нужно знать в первую очередь
Swift — язык Apple для iOS, macOS, watchOS и серверной разработки. Он строго типизирован, но тип чаще всего выводится сам. Новичок почти сразу сталкивается с пятью темами: константы и переменные, опционалы, структуры и классы, перечисления и замыкания. Разберём каждую на коротких примерах — их можно запустить в Xcode Playground или на swift.org.
let и var
let— константа, значение нельзя изменить после присваивания.var— переменная.
let name = "Aziz" // тип String выведен автоматически
var score = 10
score += 5 // можно
// name = "Bobur" // ошибка компиляции
let price: Double = 9.5 // тип можно указать явно
Правило: по умолчанию пишите let, а var — только когда значение действительно меняется. Компилятор сам подскажет, если var не нужен.
Опционалы и распаковка
Опционал (String?, Int?) означает: «здесь может быть значение, а может быть nil». Обычная переменная String никогда не бывает nil — это защищает от целого класса ошибок.
let input = "42"
let number: Int? = Int(input) // строка может не быть числом
// 1. if let — распаковать, если значение есть
if let n = number {
print("Число: \(n)")
}
// 2. guard let — выйти раньше, если значения нет
func double(_ value: Int?) -> Int {
guard let v = value else { return 0 }
return v * 2
}
// 3. ?? — значение по умолчанию
let safe = number ?? 0
// 4. ?. — опциональная цепочка
let length = Int("abc")?.description.count // nil
Есть и принудительная распаковка number!. Если внутри nil, приложение упадёт. Используйте её только когда значение гарантировано, а лучше — не используйте вовсе.
Структуры и классы
Главное различие — struct передаётся по значению, class — по ссылке.
struct Point { var x: Int; var y: Int }
class Counter { var value = 0 }
var a = Point(x: 1, y: 2)
var b = a // копия
b.x = 100 // a.x всё ещё 1
let c1 = Counter()
let c2 = c1 // та же ссылка
c2.value = 5 // c1.value тоже 5
| struct | class | |
|---|---|---|
| Передача | копия значения | ссылка на объект |
| Наследование | нет | есть |
| Автоматический инициализатор | да (memberwise) | нет |
| Изменение в методе | нужен mutating | свободно |
Практика Swift: начинайте со struct, а class берите, когда нужна общая изменяемая сущность, наследование или совместимость с Objective-C API.
Перечисления
enum в Swift — не просто набор констант. Варианты могут хранить связанные значения, а switch обязан покрыть все случаи.
enum PaymentStatus {
case pending
case paid(amount: Double)
case failed(reason: String)
}
let status = PaymentStatus.paid(amount: 250)
switch status {
case .pending: print("Ожидает")
case .paid(let amount): print("Оплачено: \(amount)")
case .failed(let reason): print("Ошибка: \(reason)")
}
Если вы добавите новый вариант, компилятор покажет все switch, которые нужно обновить.
Замыкания
Замыкание — функция без имени, которую можно передать как значение. Их постоянно используют для сортировки, фильтрации и колбэков.
let prices = [120, 45, 80]
let sorted = prices.sorted { $0 < $1 } // [45, 80, 120]
let expensive = prices.filter { $0 > 50 } // [120, 80]
let labels = prices.map { "\($0) сум" }
func load(completion: (String) -> Void) {
completion("готово")
}
load { result in print(result) }
$0, $1 — короткие имена аргументов. Синтаксис с замыканием после скобок называется trailing closure.
Частые ошибки новичков
- Повсюду ставить
!вместоif let/guard let. - Делать всё классами по привычке из других языков.
- Использовать
var, когда хватаетlet. - Писать
defaultвswitchпо enum и терять подсказки компилятора о новых вариантах.
Официальное руководство по языку — The Swift Programming Language.