Swift — это современный язык программирования, который создала компания Apple. На нём пишут приложения для macOS, iOS, серверов и других платформ. А ещё с его помощью можно написать софт для умного дома или микроконтроллеров. Рассказываем, что ещё умеет Swift, в чём его особенности и как его выучить.
История языка Swift
Раньше в экосистеме Apple всё писали на языке Objective-C. Он использовался с 80-х годов, но к 2010-му уже устарел. В нём не хватало важных современных возможностей, например замыканий и дженериков — сущностей, которые не зависят от конкретных типов данных.
К тому же Objective-C был сложным для понимания, особенно для новичков, и не всегда безопасным (например, можно было случайно обратиться к памяти, где данных уже нет). Ну и ещё со временем он стал откровенно старым — это был язык, созданный для другой эпохи.
Apple решила, что пора придумать что-то новое: более производительное, удобное и безопасное. И в 2010 году началась разработка Swift под руководством Криса Латтнера и его команды, куда входили Дуг Грегор, Джон МакКолл, Тед Кременек и Джо Грофф. Вдохновение они черпали из множества языков: Objective-C, Rust, Haskell, Ruby, Python, C# и даже из менее известных языков вроде CLU.
Для работы с языком Apple активно развивала среду разработки Xcode. Изначально Xcode была разработана для работы с Objective-C и впервые вышла в 2003 году. Xcode стала основным инструментом для программирования в экосистеме Apple. Она включала редактор кода, средства для дизайна интерфейсов, симуляторы устройств и инструменты отладки.
В 2014 году вышла первая версия — Swift 1.0, а уже через год, на конференции WWDC 2015, Apple представила значительно улучшенный Swift 2.0. В 2015 году Swift стал проектом с открытым исходным кодом под лицензией Apache 2.0. То есть теперь не только Apple, но и разработчики со всего мира могут участвовать в его развитии. На тот момент язык поддерживал платформы Apple и Linux.
Например, так на Objective-C выглядит Hello, world!
:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Hello, world!");
}
return 0;
}
А вот так на Swift:
print("Hello, world!")
В Objective-C нужно вручную создавать пул для управления памятью с помощью @autoreleasepool
. В Swift же всё управляется автоматически и код намного лаконичнее.
В 2016 году вышел Swift 3.0, где было много изменений, в том числе переработка синтаксиса. Эти изменения сделали Swift более удобным и читаемым, но разработчикам пришлось потратить время на адаптацию к новому стилю. К началу 2018 года Swift стал популярнее Objective-C. Всё больше приложений для iOS и macOS начали разрабатываться именно на Swift.
В Swift 4.0 добавили функцию миграции кода в Xcode. Теперь можно было легко обновить проекты, написанные на более старых версиях языка. В пятой версии добавили поддержку ABI (Application Binary Interface) для iOS. Это означало, что разработчики могли создавать более компактные приложения, так как стандартные библиотеки Swift теперь были встроены в операционную систему.
Современный интерфейс Xcode с проектом SwiftUI: структура проекта, код и предварительный просмотр интерфейса приложения
Ну и наконец, в 2024 году вышла шестая версия языка. Среди главных изменений — улучшенная защита данных и появление нового инструмента под названием Embedded Swift, который позволяет использовать язык в устройствах с ограниченными ресурсами, например в умных гаджетах.
Где и для чего используется Swift
В первую очередь Swift используется для разработки приложений в экосистеме Apple: iOS, macOS, watchOS и tvOS. Многие известные приложения либо переписаны, либо написаны на Swift — LinkedIn, Airbnb, Slack. Например, iOS-приложение для вызова такси Lyft полностью переписали на Swift. Если раньше код занимал около 75 000 строк, то на Swift ту же функциональность удалось уместить менее чем в трети исходного объёма.
С развитием Embedded Swift язык стали использовать для работы с умными часами, датчиками или бытовой техникой. На Swift можно написать прошивку для умного термостата или системы безопасности для дома.
На Swift пишут игры и приложения с дополненной реальностью, используя библиотеки SpriteKit, SceneKit и ARKit. Приложение IKEA Place, которое позволяет расставлять мебель в доме, сделано с помощью ARKit.
Кроме того, на Swift можно писать серверную часть для приложений с помощью фреймворков Vapor или Kiturami и даже использовать их для машинного обучения. С Vapor можно развернуть сервер, который обрабатывает большие модели машинного обучения и отправляет результаты клиенту.
Как это работает? Сервер принимает данные, передаёт их в модель машинного обучения, обработанную с помощью Core ML, а затем возвращает результат клиенту в виде JSON. Такой подход снижает нагрузку на память устройств, позволяет использовать более сложные модели и упрощает обновление системы.
Основные характеристики языка Swift
Swift — выразительный и универсальный язык. Его создавали с расчётом на простоту, безопасность и высокую производительность. Он подходит для самых разных задач — от разработки мобильных приложений до серверной части и встраиваемых систем. А если вы освоите Swift для iOS, то в будущем сможете легко переключиться на другие области программирования, не изучая новый язык с нуля.На ноябрь 2024 года Swift занимает 15-е место в рейтинге языков TIOBE.
В Swift понятный синтаксис. Если вы уже знакомы с Python или JavaScript, то сразу заметите сходство: простота и читаемость на первом месте. Другая важная особенность — строгая типизация. Это значит, что тип данных переменной или константы остаётся неизменным после её объявления. Например, если мы напишем
var age: Int = 25
age = "двадцать пять" // Ошибка
то компилятор сразу выдаст ошибку, поскольку age
не может быть строкой:
Это предотвращает ошибки на ранних этапах разработки и делает язык безопасным.
Кроме удобства и безопасности, Swift ещё и быстрый. Он переводит код в машинный язык, понятный процессору, используя инструмент LLVM. Во время компиляции приложение преобразуется в набор инструкций, которые компьютер может выполнять напрямую. При запуске эти инструкции вместе с нужными библиотеками загружаются в статическую память — область, которая выделяется ещё до отображения приложения на экране и остаётся доступной на протяжении всей его работы. Из этой памяти приложение получает все ресурсы для выполнения задач. Благодаря этому приложения на Swift работают быстро и стабильно, как программы на C++ и Rust.
Для быстрого изучения языка и экспериментов есть интерактивная среда Playground. Например, можно написать небольшой алгоритм или протестировать функции, не создавая полноценное приложение. А с помощью дополнительных библиотек в Playground можно работать даже с графическими и интерактивными элементами.
Преимущества и недостатки языка Swift
Swift — безопасный и производительный язык, который делает разработку проще и удобнее. Но у него есть свои особенности, которые стоит учитывать.
✅ Преимущества
- Высокая производительность. Код на Swift компилируется в машинный язык, поэтому приложения работают быстро и эффективно, будь то игра, сложные вычисления или серверная часть.
- Удобочитаемость. Синтаксис Swift понятен, учиться ему проще.
- Безопасность. Строгая типизация и защита от ошибок помогают избегать проблем в приложениях. Это особенно важно для крупных проектов.
- Playground. Интерактивная среда Swift Playground позволяет тестировать код и сразу видеть результат.
- Универсальность. Swift подходит для мобильных приложений, серверной разработки, а также для встроенных систем.
❌ Недостатки
- Сложности с миграцией. Если приложение изначально написано на Objective-C, перевести его на Swift может быть непросто. Комбинированные проекты требуют дополнительного времени и усилий.
- Молодость языка. Swift всё ещё активно развивается. Иногда это приводит к изменениям в синтаксисе или поведении.
- Ограничения инструментов. Swift отлично работает с Xcode, но использование сторонних IDE или инструментов может быть проблематичным.
Ограничения платформ. Swift не поддерживает старые версии iOS, что может быть проблемой, если приложение должно работать на устаревших устройствах.
Примеры кода на языке Swift
Чтобы начать писать код на Swift, понадобится компьютер Mac и инструменты для разработки — в первую очередь Xcode, который содержит редактор кода, симуляторы устройств и компилятор для Swift. Xcode доступен бесплатно в Mac App Store.
Также на macOS можно писать код на Swift прямо в терминале. Для этого нужно ввести команду swift
:
Откроется интерактивный режим (REPL), где можно писать и выполнять код.
В Swift есть разные типы данных: Int
для целых чисел, Double
и Float
для чисел с плавающей точкой, String
для текста, Bool
для логических значений, Array
(массивы), Dictionary
(словари) для хранения коллекций данных и другие. Также Swift поддерживает дженерики — универсальные шаблоны, которые позволяют реализовывать гибкие конструкции без привязки к конкретным типам данных.
Указывать тип данных (аннотировать) нужно, когда компилятор не может сам определить его однозначно, или когда требуется высокая точность. Например, дробное число по умолчанию интерпретируется как Double
, но если нужен Float
, то указываем тип явно:
let myNumber: Float = 3.14
Создадим массив и посчитаем сумму его элементов:
// создаём массив чисел
let numbers = [1, 2, 3, 4, 5]
// используем метод reduce для вычисления суммы элементов
let sum = numbers.reduce(0, +)
// выводим результат
print("Сумма чисел: \(sum)")
В этом коде мы создали массив чисел, но не указали его тип, поскольку в Swift есть выведение типов. В нашем случае мы присваиваем числовое значение константе, и компилятор сам понимает, что numbers
— это массив целых чисел [Int]
, поскольку все элементы массива — это целые числа. Если мы попытаемся добавить в этот массив строку, то из-за строгой типизации языка получим ошибку:
numbers.append("текст")
Компилятор ругается, что метод append
ожидает значение типа Int
, а мы пытаемся передать строку.
Другая интересная штука в Swift — опционал. Это специальный тип данных, который может содержать либо значение, либо быть пустым (nil
). Обычно переменные и константы в Swift всегда должны иметь значение, но бывают ситуации, когда значение может быть неизвестным.
Допустим, программа просит пользователя ввести имя, возраст и место работы. Имя и возраст есть у всех, а вот работа — нет. Можно оставить эту переменную пустой строкой, но это не лучший подход: пустая строка не всегда очевидно указывает на отсутствие данных.
Тогда мы добавляем опционал и явно говорим программе: «Эта переменная может быть пустой». Если пользователь не указал место работы, то тогда вместо проверок данных мы получим ответ, что значения просто нет. У переменной есть два состояния: либо она хранит значение, либо явно даёт понять, что его нет (nil
):
struct User {
var name: String
var age: Int
var workplace: String? // Опционал: место работы может быть пустым
}
В этом коде мы создали структуру — объект struct
— и задали ему три свойства: name
, age
, workplace
. Поскольку третье свойство необязательно, мы сделали его опциональным, указав, что эта строка может содержать название места работы или быть пустой. Если пользователь ничего не введёт, то программа не сломается.
А вот код простой игры для терминала «Орёл или решка». Компьютер «подбрасывает монетку», а пользователь отгадывает, что выпало:
// Импортируем библиотеку Foundation для стандартных функций
import Foundation
// Генерируем случайный результат — орла или решку
let coinFlip = Bool.random() // true — орёл, false — решка
// Устанавливаем флаг для состояния игры
// Пока пользователь не угадал, игра продолжается
var isCorrect = false
// Выводим приветствие и правила
print("Сыграем в 'Орёл или решка'!")
print("Я подбросил монетку. Попробуй угадать: орёл или решка?")
// Начинаем игровой цикл
while !isCorrect {
// Запрашиваем у пользователя его предположение
print("Введи свой ответ (орёл/решка):")
// Читаем ввод пользователя
if let input = readLine()?.lowercased() { // Приводим ввод к нижнему регистру
// Проверяем, что пользователь ввёл корректный вариант
if input == "орёл" || input == "решка" {
// Сравниваем ввод пользователя с результатом
if (input == "орёл" && coinFlip) || (input == "решка" && !coinFlip) {
// Если угадал, поздравляем и завершаем игру
print("Поздравляю! Это правильный ответ!")
isCorrect = true // Устанавливаем флаг в true, чтобы выйти из цикла
} else {
// Если не угадал, выводим сообщение и просим попробовать ещё раз
print("Неверно! Попробуй снова.")
}
} else {
// Если ввод не "орёл" или "решка", выводим сообщение об ошибке
print("Пожалуйста, введи только 'орёл' или 'решка'.")
}
} else {
// Если ввод пустой или некорректный, просим повторить попытку
print("Пожалуйста, введи ответ.")
}
}
Чтобы сыграть в игру, нужно сохранить код в файл и затем запустить его в терминале:
swift имя_файла.swift
С таких базовых примеров постепенно можно перейти к созданию более сложных приложений в среде разработки. Например, начать с того, чтобы добавить простой игре графический интерфейс и анимацию.
Сложности и особенности изучения языка Swift
Несмотря на простой и лаконичный синтаксис, кое-что в Swift может показаться сложным. Swift — это многопарадигмальный язык программирования, который включает в себя идеи из Haskell, Scala и F#. Это значит, что он поддерживает разные стили программирования: императивное, объектно-ориентированное, функциональное, протокол-ориентированное. Можно выбрать разные подходы под разные задачи: для работы с данными лучше подойдёт функциональный стиль, а для описания сложной иерархии — ООП.
Для полноценного владения Swift недостаточно знать только язык — придётся разбираться и с библиотеками Apple, без которых приложения не сделать. А без понимания принципов ООП не получится освоить системные библиотеки или читать документацию Apple.
Ограничения накладывает и сама мобильная разработка. Устройства Apple — это системы с ограниченной памятью и вычислительными ресурсами. Нужно писать не просто рабочий, но и эффективный код, экономящий память.Поэтому изучение Swift лучше начать с простого: научиться добавлять элементы интерфейса (кнопки или текстовые поля) в Xcode и связывать их с кодом через атрибуты IBOutlet
и IBAction
:
Затем, если захотите сделать что-то посложнее, например обновлять экран после получения данных с сервера, придётся разобраться с очередями и асинхронным программированием, чтобы правильно управлять процессами.
С чего начать обучение языку Swift
Если знаете английский — начните с официальной страницы языка.
Почитайте нашу статью про основные конструкции Swift. Там мы рассказали про переменные, условные операторы, циклы, функции, классы и другие штуки, чтобы вы могли написать свой первый код.А если хочется углубиться в язык и делать реальные приложения, то приходите на курс Практикума «iOS‑разработчик». Там изучите Swift, его фреймворки и другие инструменты, а также сделаете 4 больших полноценных приложения. На курсе есть бесплатная часть: можно в своём темпе познакомиться с языком Swift, дописать и запустить своё первое приложение в Xcode — игру Pong.