В данной статье не будет подробного разбора кода, я добавил краткие примеры, чтобы у тебя (если ты новичок), было представление о том, как выглядит в коде та или иная технология. Следуя этому плану, обращаясь к указанным ресурсам, можно уверенно дойди до уровня Junior и начать поиск свой первой работы.
Почему стоит выбрать iOS-разработку?
iOS-разработка остается одним из самых востребованных направлений в IT. Спрос на специалистов растет, зарплаты остаются высокими, а сам процесс разработки комфортный благодаря экосистеме Apple. Не стоит бояться разговоров о том, что рынок перегрет, главное знать зачем вы это делаете и просто дойди до конца.
💰 Сколько зарабатывают iOS-разработчики в России в 2025 году?
• Junior – 120 000–180 000 ₽
• Middle – 250 000–350 000 ₽
• Senior – от 400 000 ₽ и выше
Но чтобы получить первый оффер, нужно освоить Swift, UIKit, сетевое взаимодействие, архитектуры (у вас должно быть понимание, для чего та или иная архитектура, основные сущности, не обязательно глубоко разбираться) и основы хранения данных. Давай разберемся, с чего начать.
1. Изучение Swift и основ программирования
Swift – это современный язык программирования от Apple. На нем пишут приложения для iOS, macOS, watchOS и tvOS.
📌 Что нужно изучить в первую очередь?
✅ Основы (переменные, типы данных, операторы)
✅ Управляющие конструкции (if, switch, for, while)
✅ Коллекции (Array, Set, Dictionary)
✅ Опционалы (Optional, nil, guard let, if let)
✅ Основы ООП (классы, структуры, наследование, протоколы)
✅ Управление памятью (ARC, weak, strong, unowned)
Пример кода:
struct User {
let name: String
var age: Int
}
// Создаем экземпляр структуры
var user = User(name: "Иван", age: 25)
// Выводим данные в консоль
print("Пользователь: \(user.name), возраст: \(user.age)")
👉 Где учить Swift?
• Swift Playgrounds (приложение на iPad и Mac в котором вы можете понять базовые принципы программирования)– для ознакомления с миром программирования
• Курс Скутаренко по Swift (можете найти на ютуб, он уже старый, но о сих по актуальный) – лучший для старта
• Hacking with Swift – практический подход
2. UIKit – основа создания интерфейсов
UIKit – это библиотека UI-компонентов для построения интерфейсов в iOS-приложениях. SwiftUI активно развивается, но в коммерческих проектах по-прежнему доминирует UIKit. Компаний, которые пишут на SwiftUI, не так много, поэтому советую разбирать его после погружения в UIKit.
📌 Основные компоненты UIKit:
✅ UIView, UIViewController – базовые строительные блоки UI
✅ UILabel, UIButton, UIImageView – стандартные элементы
✅ Auto Layout – система позиционирования элементов
✅ UITableView, UICollectionView – списки и сетки
✅ NavigationController, TabBarController – навигация
Компонентов гораздо больше, я написал лишь самые основные. В курсах Алексея Скутаренко также есть материалы про UIKit. Очень хорошие практические курсы — Hacking with Swift. Там вы получите не только базу, но и домашние задания, которые заставят задуматься о том, как реализовать тот или иной компонент.
Пример кода:
class ViewController: UIViewController, UITableViewDataSource {
let tableView = UITableView()
let items = ["Apple", "Google", "Microsoft"]
override func viewDidLoad() {
super.viewDidLoad()
// Подключаем dataSource
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
view.addSubview(tableView)
}
// Количество строк в таблице
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
// Заполнение ячейки таблицы
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = items[indexPath.row]
return cell
}
}
3. Работа с сетью (URLSession)
Почти все приложения загружают данные с сервера. В iOS для этого используют URLSession. Клиент-серверное взаимодействие — это основная часть работы. Можно сказать, что вам всегда придется работать с командой бэкенда: они будут формировать удобный API, а вы — получать данные через него и отображать их в своем приложении.
Пример запроса к API:
struct User: Codable {
let id: Int
let name: String
}
func fetchUsers() {
guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else { return }
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
let users = try? JSONDecoder().decode([User].self, from: data)
print(users ?? [])
}
}.resume()
}
4. Хранение данных (UserDefaults, Core Data)
📌 Где хранят данные?
✅ UserDefaults — для небольших данных, которые нужно сохранить между сессиями приложения, например:
• Настройки (например, тема приложения, язык);
• Флаги, такие как переключатели состояния (например, пользователь включил уведомления);
• Состояние интерфейса (например, последний выбранный элемент в списке).
Преимущество: Легко использовать, данные сохраняются в виде пар «ключ-значение», но подходит для небольших данных и не рекомендуется для хранения чувствительных или крупных данных.
✅ KeyChain — для хранения данных, которые требуют повышенной безопасности, например:
• Пароли пользователей;
• Токены доступа (например, для аутентификации в приложении);
• Ключи для шифрования.
Преимущество: Обеспечивает высокий уровень безопасности, данные сохраняются в зашифрованном виде, доступ к ним ограничен только для вашего приложения.
✅ Core Data — для сложных структур данных, которые требуют хранения больших объемов информации, например:
• Базы данных (например, список товаров в магазине);
• Пользовательские объекты с несколькими свойствами и отношениями (например, объекты, которые могут быть связаны друг с другом: авторы и книги);
• Кэширование больших объемов данных, которые часто обновляются.
Преимущество: Мощная и гибкая система для работы с большими объемами данных, поддерживает запросы, сортировку и фильтрацию данных. Подходит для более сложных сценариев, где нужно эффективно работать с данными, их отношениями и метаданными.
Пример работы с UserDefaults:
UserDefaults.standard.set("Иван", forKey: "username")
let name = UserDefaults.standard.string(forKey: "username")
print(name ?? "Нет имени")
5. Архитектуры в iOS
Про остальные инструменты не вижу смысла прикладывать примеры, они требуют реального погружения и понимания.
Архитектуры нужны для:
1. Организации кода — упрощают структуру и делают приложение понятным.
2. Упрощения тестирования — разделяют логику, чтобы тестировать её по частям.
3. Масштабируемости — облегчают добавление новых функций.
4. Снижения сложности — упрощают поддержку и понимание кода.
5. Командной работы — обеспечивают общие стандарты для разработчиков.
6. Повторного использования кода — позволяют использовать компоненты в других проектах.
Они помогают создавать более удобные, поддерживаемые и расширяемые приложения.
А теперь расскажу какие вообще существуют и в чем их отличие.
1. MVC (Model-View-Controller)
Стандартная архитектура для iOS-приложений. Контроллер управляет взаимодействием между Model и View, но может становиться перегруженным.
2. MVVM (Model-View-ViewModel)
Улучшенная версия MVC, где ViewModel берет на себя логику преобразования данных, упрощая тестирование, улучшая читаемость кода и освобождая контроллеры от лишней логики.
3. MVP (Model-View-Presenter)
Здесь Presenter заменяет контроллер и управляет логикой взаимодействия между Model и View, улучшая тестируемость.
4. VIPER (View-Interactor-Presenter-Entity-Router)
Модульная архитектура с четким разделением обязанностей между компонентами, что улучшает гибкость и тестируемость.
Заключение по архитектурам
Кроме этих основных архитектур, существуют и другие подходы, такие как Clean Architecture, Flux, Redux, которые также могут быть использованы в iOS-разработке.
6. Первое приложение в портфолио
Довольно большим плюсом при поиске работы будет наличие своего приложения, опубликованного на GitHub, также вы можете его довести до продашн приложения уже с полноценным функционалом и опубликовать в AppStore. Я дам скелет такого приложения, в котором обязательно должно быть:
📌 Приложение “Список пользователей”
✅ Таблица с пользователями
✅ Данные загружаются с API
✅ Экран деталей пользователя
✅ Возможность добавлять пользователей в “Избранное”
📌 Что использовать?
✅ UIKit – интерфейс
✅ URLSession – работа с сетью
✅ UserDefaults/Core Data – хранение данных
✅ MVVM – архитектура
📌 Как оформить?
✔️ Опубликовать код на GitHub
✔️ Добавить скриншоты, описание
✔️ Сделать Readme с описанием
Пример такого приложения:
1. Модель данных (User.swift)
struct User: Codable {
let id: Int
let name: String
let username: String
let email: String
}
2. Вью-контроллер (ViewController.swift)
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
// Массив пользователей
var users: [User] = []
// Таблица для отображения пользователей
var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Настройка экрана
self.view.backgroundColor = .white
self.title = "Users"
// Настройка таблицы
setupTableView()
// Загрузка данных с API
fetchUsers()
}
// Функция для создания и настройки таблицы
func setupTableView() {
tableView = UITableView(frame: self.view.bounds, style: .plain)
tableView.dataSource = self
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UserCell")
self.view.addSubview(tableView)
}
// Функция для загрузки данных о пользователях
func fetchUsers() {
let urlString = "https://jsonplaceholder.typicode.com/users"
guard let url = URL(string: urlString) else { return }
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("Ошибка загрузки данных: \(error)")
return
}
guard let data = data else { return }
// Декодирование данных в массив пользователей
do {
let decoder = JSONDecoder()
self.users = try decoder.decode([User].self, from: data)
// Обновляем UI на главном потоке
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch let error {
print("Ошибка декодирования данных: \(error)")
}
}
task.resume()
}
// MARK: - UITableViewDataSource
// Количество строк в таблице
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
// Настройка ячеек таблицы
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath)
let user = users[indexPath.row]
cell.textLabel?.text = user.name
cell.detailTextLabel?.text = user.email
return cell
}
}
Пояснения:
1. Программная настройка интерфейса: Мы создали таблицу с помощью кода, без использования Storyboard. Она занимает весь экран, и мы настраиваем все компоненты непосредственно в коде.
2. URLSession: Мы продолжаем использовать URLSession для загрузки данных с API и декодирования их в массив объектов User.
3. Навигация: Мы добавили UINavigationController в AppDelegate или SceneDelegate, чтобы можно было легко добавлять навигацию, если это понадобится в будущем.
4. UITableView: Все элементы UI создаются и конфигурируются вручную в коде, что полезно для понимания, как устроен интерфейс в iOS.
Это базовый скелет приложения, реализованный на MVC, с некорректной ссылкой и данными, но для общего понимания вам будет достаточно. Когда вы дойдете до этого пункта, вы уже будете понимать все, что происходит в коде, и сможете легко доработать его до финальной версии приложения на MVVM.
7. Где искать работу?
📌 Площадки:
• hh.ru
• Telegram-каналы с вакансиями (один из таких)
📌 Как увеличить шансы?
✔️ Сделать 1 качественный проект в портфолио
✔️ Активно откликаться (20+ резюме в день)
✔️ Подготовиться к техническим интервью
Хорошим помощником в подготовке будет телеграмм канал, там есть ответ на множество вопросов с собеседований. При должном подходе реально зайти за 6-9 месяцев с ежедневным обучение 3-4 часа.
А как грамотно написать продающее резюме? А это тема для отдельной статьи, присылай 🔥 в комментарии и я обязательно ее напишу!