Новое: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 источников: карьерные страницы компаний и джоб-борды.

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

Что такое паттерн delegate в UIKit и почему он широко используется?

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

Delegate — протокол, через который объект сообщает о событиях без жёсткой связи. UITableViewDelegate, UITextFieldDelegate и т.д. используют его, чтобы разделить логику отображения и бизнес-логику.

Рабочий пример: кастомный делегат

import UIKit

// 1. Объявляем протокол
protocol LoginFormDelegate: AnyObject {
    func loginForm(_ form: LoginFormView, didSubmitEmail email: String, password: String)
    func loginFormDidTapForgotPassword(_ form: LoginFormView)
}

// 2. Компонент хранит делегат слабой ссылкой
final class LoginFormView: UIView {
    weak var delegate: LoginFormDelegate?   // weak — чтобы избежать retain cycle

    private let emailField = UITextField()
    private let passwordField = UITextField()
    private let submitButton = UIButton(type: .system)
    private let forgotButton = UIButton(type: .system)

    override init(frame: CGRect) {
        super.init(frame: frame)
        submitButton.addTarget(self, action: #selector(handleSubmit), for: .touchUpInside)
        forgotButton.addTarget(self, action: #selector(handleForgot), for: .touchUpInside)
    }
    required init?(coder: NSCoder) { fatalError() }

    @objc private func handleSubmit() {
        guard
            let email = emailField.text, !email.isEmpty,
            let password = passwordField.text, !password.isEmpty
        else { return }
        delegate?.loginForm(self, didSubmitEmail: email, password: password)
    }

    @objc private func handleForgot() {
        delegate?.loginFormDidTapForgotPassword(self)
    }
}

// 3. Контроллер становится делегатом
final class AuthViewController: UIViewController, LoginFormDelegate {
    private let loginForm = LoginFormView()

    override func viewDidLoad() {
        super.viewDidLoad()
        loginForm.delegate = self   // назначаем себя
        view.addSubview(loginForm)
    }

    // MARK: — LoginFormDelegate
    func loginForm(_ form: LoginFormView, didSubmitEmail email: String, password: String) {
        Task {
            do {
                try await AuthService.shared.login(email: email, password: password)
                // навигация на главный экран
            } catch {
                showAlert(error.localizedDescription)
            }
        }
    }

    func loginFormDidTapForgotPassword(_ form: LoginFormView) {
        let vc = ForgotPasswordViewController()
        present(vc, animated: true)
    }
}

Что такое delegate pattern

Delegate pattern позволяет одному объекту делегировать часть своего поведения другому объекту, который реализует заданный протокол. Это разновидность composition over inheritance: вместо того чтобы наследоваться от UITableView и переопределять методы, вы реализуете протокол UITableViewDelegate и передаёте себя в свойство tableView.delegate.

UIKit использует этот паттерн повсеместно: UITableViewDataSource, UITextFieldDelegate, UIScrollViewDelegate, CLLocationManagerDelegate, URLSessionDelegate — всё это делегаты.

Почему UIKit выбрал этот паттерн

Инверсия зависимости — UITableView ничего не знает о вашей бизнес-логике; он работает через абстрактный протокол. Это позволяет переиспользовать компонент в разных контекстах.

Loose coupling — компонент и его делегат можно менять независимо. Ни один из них не импортирует модули другого напрямую.

Контроль над потоком выполнения — делегат вызывается синхронно в момент события, что даёт предсказуемый порядок действий в main thread.

Ограниченная зона ответственности — компонент занимается отображением, делегат — реакцией на события. Нарушение этой границы (логика в UIView) — типичный запах плохого кода в UIKit-проектах.

Альтернативы и когда их выбирать

Closure/callback удобен для одного события без обратной связи. NotificationCenter подходит для широковещательных событий «один ко многим». Combine/async-stream — когда нужен поток значений с backpressure. Delegate остаётся предпочтительным, когда объект предоставляет несколько связанных методов и важна явная точка конфигурации.

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

  • Сильная ссылка на delegate — без weak контроллер и компонент удерживают друг друга, утечка памяти гарантирована.
  • Не назначить делегат до отображения — если loginForm.delegate = self стоит после view.addSubview и пользователь успевает нажать кнопку, событие теряется.
  • Вызов делегата не на main thread — системные API (CoreLocation, URLSession) могут вызывать делегат на фоновом потоке; без DispatchQueue.main.async обновление UI приведёт к неопределённому поведению.
  • Протокол без AnyObject — без ограничения : AnyObject нельзя объявить weak var delegate; компилятор выдаст ошибку.
  • Слишком толстый протокол — 15 методов в одном делегате нарушают ISP; лучше разбить на несколько узких протоколов (как UITableViewDataSource vs UITableViewDelegate).
  • Обращение к delegate после dealloc — если делегат освобождён, а компонент живёт дольше, вызов через weak-ссылку безопасен (nil), но нужно убедиться, что компонент не хранит копию ссылки в другом месте.
  • Путать delegate с data source — delegate реагирует на события, data source поставляет данные; смешивание обоих в одном объекте нормально для простых экранов, но усложняет тестирование.

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

  • Что такое Auto Layout и как создавать constraints программно по сравнению с Interface Builder?
  • Как работает навигация в UIKit с помощью UINavigationController?
  • В чём разница между UIView и UIViewController?
  • Как работает жизненный цикл UIViewController? Опишите каждый lifecycle-метод.

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

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

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

  • Формулирует точную модель для «паттерн delegate в UIKit и почему он широко используется» и подтверждает ее корректным примером.
  • Умеет связать ответ с main thread, тестированием и отладкой на устройстве.
  • Называет ограничения подхода uikit-10, включая производительность, память и сопровождение.

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

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

Источники

  • https://developer.apple.com/documentation/swift/automaticreferencecounting
←Предыдущий вопросВ чём разница между `frame`, `bounds` и `center` в UIKit?Следующий вопрос→В каких mobile-проектах UIKit является сильным выбором, а где лучше выбрать native или другую cross-platform альтернативу?

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

UIKitframework-api-designMobile-Engineering