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

+1 183новые вакансии за сутки·93 833вакансии открыты сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 230
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии996
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

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

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

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

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое protocols в Swift и чем они отличаются от интерфейсов в других языках?

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

Протокол в Swift — контракт для методов и свойств, применимый к struct/enum/class (не только к классам). В отличие от Java-интерфейсов, поддерживает реализации по умолчанию через extensions и обобщения через associatedtype.

Объявление протокола

protocol Vehicle {
    var speed: Double { get }
    var fuelType: String { get set }
    func accelerate(by delta: Double)
    func describe() -> String
}

Протоколы в Swift

Протокол (protocol) в Swift — это контракт, описывающий набор методов, свойств и других требований, которым должен соответствовать тип. Протоколы могут реализовывать классы, структуры и перечисления — это принципиальное отличие от интерфейсов в Java/Kotlin, которые применимы только к классам.

Реализация протокола структурой

struct ElectricCar: Vehicle {
    var speed: Double = 0
    var fuelType: String = "Electric"

    mutating func accelerate(by delta: Double) {
        speed += delta
    }

    func describe() -> String {
        return "Электромобиль, скорость: \(speed) км/ч"
    }
}

var car = ElectricCar()
car.accelerate(by: 60)
print(car.describe()) // "Электромобиль, скорость: 60.0 км/ч"

Protocol extensions — реализации по умолчанию

Это уникальная особенность Swift. В Java/Kotlin default-методы в интерфейсах ограничены, а в Swift протоколы могут предоставлять полноценные реализации через extension.

extension Vehicle {
    func describe() -> String {
        return "Транспорт, тип топлива: \(fuelType)"
    }
}

struct Bicycle: Vehicle {
    var speed: Double = 0
    var fuelType: String = "Human"
    mutating func accelerate(by delta: Double) { speed += delta }
    // describe() не переопределяем — используем extension
}

print(Bicycle().describe()) // "Транспорт, тип топлива: Human"

Протокол как тип (existential)

func printInfo(of vehicle: any Vehicle) {
    print(vehicle.describe())
}

let vehicles: [any Vehicle] = [ElectricCar(), Bicycle()]
vehicles.forEach { printInfo(of: $0) }

associatedtype — обобщённые протоколы

Аналогов в Java-интерфейсах нет. associatedtype позволяет протоколу работать с абстрактным типом-заполнителем.

protocol Container {
    associatedtype Item
    var items: [Item] { get }
    mutating func add(_ item: Item)
}

struct Box<T>: Container {
    var items: [T] = []
    mutating func add(_ item: T) { items.append(item) }
}

var box = Box<Int>()
box.add(1)
box.add(2)
print(box.items) // [1, 2]

Отличия от интерфейсов Java/Kotlin

  • Применимы к struct, enum, class — не только к классам.
  • Поддерживают associatedtype и Self-ограничения.
  • Protocol extensions дают полноценные реализации по умолчанию.
  • Нет неявного соответствия — тип обязан явно указать протокол.
  • Свойства в протоколе задают только get/set требования, без хранения.
  • Протоколы могут наследоваться от других протоколов и формировать иерархии.

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

  • Протокол с associatedtype или Self-требованием нельзя использовать как тип переменной напрямую — нужен any или some.
  • В Swift 5.7+ экзистенциальный тип требует ключевого слова any; отсутствие его вызывает предупреждения компилятора.
  • Метод структуры, изменяющий состояние, должен быть помечен mutating как в протоколе, так и в реализации.
  • Динамическая диспетчеризация через экзистенциальный тип медленнее статической через generics.
  • Protocol composition (TypeA & TypeB) полезна, но слишком сложные composition-типы затрудняют читаемость.
  • Инициализаторы в протоколах требуют required в классах, иначе компилятор выдаёт ошибку.
  • @objc-протоколы (для Objective-C interop) поддерживают только классы и ограничены в возможностях.

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

  • Сводить «protocols в Swift и чем они отличаются от интерфейсов в других языках» к синтаксису и не объяснять границы Objective-C.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии swift-8.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

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

  • Формулирует точную модель для «protocols в Swift и чем они отличаются от интерфейсов в других языках» и подтверждает ее корректным примером.
  • Умеет связать ответ с модель памяти, тестированием и отладкой на устройстве.
  • Называет ограничения подхода swift-8, включая производительность, память и сопровождение.

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

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

Источники

  • https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
←Предыдущий вопросЧто такое property wrappers в Swift (`@Published`, `@State`, `@Binding`)?Следующий вопрос→Что такое ключевое слово `some` и opaque return types в Swift?

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

Swiftlanguage-runtimeMobile-Engineering

Вакансии с этим навыком

Swift вакансии
  • iOS Software Engineer
  • FinCrime Operations Team Lead
  • Senior Staff Software Engineer, Mobile (Android and iOS) - Hyderabad, India
  • Senior Software Engineer (C++ & Swift)
  • Sr iOS Developer (AI-assisted), remote

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

  • Что такое optionals в Swift и как безопасно их разворачивать?
  • В чём разница между strong, weak и unowned ссылками?
  • Для каких задач Swift является сильным выбором, а где лучше честно выбрать другой язык?
  • В чём разница между class и struct в Swift?