Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме SwiftUIВсе вопросы
SwiftUIJuniorТеория

Что такое SwiftUI и чем его декларативный подход отличается от императивного подхода UIKit?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

SwiftUI — декларативный фреймворк: описываете UI как функцию от состояния, среда сама делает diff и обновляет нативные слои. UIKit требует ручного управления объектами. Ключевое отличие: SwiftUI реагирует на изменения источника истины автоматически.

Декларативный SwiftUI vs императивный UIKit

В UIKit разработчик вручную управляет объектами: создаёт UILabel, добавляет в иерархию, вызывает setNeedsLayout(), обновляет text при изменении данных. Код описывает последовательность действий.

В SwiftUI разработчик описывает функцию от состояния к UI. При каждом изменении источника истины (@State, @StateObject, @ObservableObject и т.д.) SwiftUI вызывает body, получает новое дерево значимых структур и сравнивает его с предыдущим — это называется diffing. Только изменившиеся части находят отражение в реальных нативных слоях (UIKit под капотом на iOS).

import SwiftUI
import Combine

// --- Модель ---
@Observable
final class CounterModel {
    var count = 0
    func increment() { count += 1 }
}

// --- UIKit-стиль (императивно) ---
// final class CounterViewController: UIViewController {
//     private let label = UILabel()
//     private var model = CounterModel()
//     override func viewDidLoad() {
//         super.viewDidLoad()
//         view.addSubview(label)
//         label.text = "\(model.count)"
//     }
//     @objc func buttonTapped() {
//         model.increment()
//         label.text = "\(model.count)"  // вручную синхронизируем UI
//     }
// }

// --- SwiftUI-стиль (декларативно) ---
struct CounterView: View {
    @State private var model = CounterModel()

    var body: some View {
        VStack(spacing: 20) {
            Text("Count: \(model.count)")
                .font(.largeTitle)
                .accessibilityLabel("Current count is \(model.count)")

            Button("Increment") {
                model.increment()   // меняем состояние — UI обновится сам
            }
            .buttonStyle(.borderedProminent)
        }
        .padding()
        .task {
            // Структурированная конкурентность: задача отменяется
            // автоматически при уходе view из иерархии
            await loadInitialCount()
        }
    }

    private func loadInitialCount() async {
        // Имитация сетевого запроса
        try? await Task.sleep(for: .seconds(1))
        model.count = 42
    }
}

// --- Предпросмотр ---
#Preview {
    CounterView()
}

Что такое SwiftUI

SwiftUI — декларативный UI-фреймворк Apple, представленный в 2019 году. Разработчик описывает что должно быть на экране через структуры, соответствующие протоколу View, а среда выполнения сама решает как и когда обновить дерево нативных элементов. Поддерживаются iOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ и visionOS.

Жизненный цикл body и инвалидация

Когда источник истины меняется, SwiftUI помечает зависимые View как dirty и на следующем проходе рендера вызывает их body. Само по себе это дёшево — структуры создаются на стеке. Дорогостоящим может стать слишком широкая зависимость: если один большой @ObservableObject публикует все изменения через objectWillChange, весь экран перерисовывается при любом изменении любого поля.

С @Observable (iOS 17+, Swift 5.9 Observation framework) гранулярность отслеживания стала автоматической: SwiftUI подписывается только на те свойства, которые реально читает body.

Сравнение моделей

АспектUIKitSwiftUI
ПарадигмаИмперативнаяДекларативная
Единица UIОбъект (UIView)Значение (View-структура)
ОбновлениеВручнуюАвтоматически через diff
Жизненный циклviewDidLoad, viewWillAppear….onAppear, .task, .onChange
КонкурентностьGCD / OperationQueueSwift Concurrency (async/await, Task)
Поддержка платформiOS / tvOSiOS, macOS, watchOS, tvOS, visionOS

Подводные камни

  • Чрезмерная инвалидация через @ObservableObject. Один @Published на весь экран приводит к перерисовке всего дерева при каждом изменении. Решение: дробить модели или переходить на @Observable (iOS 17+).
  • Неправильный выбор хранилища состояния. @State создаётся заново при удалении view из иерархии. Если состояние должно пережить навигационный переход, оно должно жить в @StateObject или в родительском view.
  • Сильные ссылки в замыканиях внутри body. Захват self в Button/.task может задержать освобождение класса. View-структуры не имеют [weak self], поэтому при работе с акторами и классами нужно явно контролировать время жизни.
  • Дорогие вычисления в body. body может вызываться несколько раз в секунду. Форматирование строк, сортировки и фильтрации следует выносить в модель или кэшировать через let-константы снаружи body.
  • Конфликт идентичности при анимации. SwiftUI идентифицирует элементы списка по значению (Identifiable) или позиции. Использование UUID как id, генерируемого каждый раз, ломает анимацию и вызывает полный rebuild списка вместо diff-анимации.
  • Блокировка main actor. @MainActor-код исполняется в главном потоке. Синхронные операции с диском или тяжёлые JSON-парсинги внутри методов, вызываемых из body, замораживают UI — даже при декларативном коде.
  • Потеря состояния при смене размера окна / Split View. На iPad при переходе в Slide Over view может пересоздаться, а @State — сброситься. Персистентное состояние следует хранить в модели, а не в локальном @State.
  • Несовместимость UIViewRepresentable и SwiftUI-жизненного цикла. При оборачивании UIKit-компонентов через UIViewRepresentable обновления SwiftUI могут вызывать updateUIView неожиданно часто. Нужно явно сравнивать старый и новый контекст, чтобы не перезапускать анимации.

Частые вопросы на собеседовании

  • Как SwiftUI перерисовывает (re-render) представления и что вызывает обновление view?
  • В чём разница между @State, @Binding, @ObservedObject и @StateObject?
  • Как async/await интегрируется с представлениями SwiftUI через модификатор .task?
  • Как работает NavigationStack в SwiftUI и чем он отличается от NavigationView?

Типичные ошибки

  • Сводить «SwiftUI и чем его декларативный подход отличается от императивного подхода UIKit» к синтаксису и не объяснять инвалидация body.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии swiftui-1.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

Что проверяет интервьюер

  • Формулирует точную модель для «SwiftUI и чем его декларативный подход отличается от императивного подхода UIKit» и подтверждает ее корректным примером.
  • Умеет связать ответ с navigation state, тестированием и отладкой на устройстве.
  • Называет ограничения подхода swiftui-1, включая производительность, память и сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме SwiftUI →

Источники

  • https://developer.apple.com/documentation/swiftui
←Предыдущий вопросКаковы лучшие практики производительности в SwiftUI (избежание лишних re-render)?Следующий вопрос→Какие production-риски есть у SwiftUI: memory, lifecycle bugs, accessibility, offline mode, app size или platform-specific behavior?

Связанные темы

SwiftUIframework-api-designMobile-Engineering