Новое: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 156
  • Вакансии в Европе24 035
  • Вакансии в Канаде4 532
  • Работа в России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Все вопросы
SwiftMiddleКодинг

Что такое generics в Swift и как использовать ограничения типов (type constraints)?

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

Generics в Swift — параметрический полиморфизм со статической специализацией. Ограничения типов задаются через T: Protocol и where-клаузы; some Protocol скрывает конкретный тип (opaque), any Protocol — existential с рантайм-диспетчеризацией.

Generics в Swift

Обобщения (generics) позволяют писать один алгоритм или тип, работающий с любым типом данных, при этом сохраняя статическую типобезопасность. Компилятор специализирует код под конкретные типы во время компиляции — в отличие от existentials, которые работают через таблицы методов в рантайме.

Базовый синтаксис

// Обобщённая функция
func swap<T>(_ a: inout T, _ b: inout T) {
    let tmp = a; a = b; b = tmp
}

// Обобщённая структура
struct Stack<Element> {
    private var storage: [Element] = []
    mutating func push(_ item: Element) { storage.append(item) }
    mutating func pop() -> Element? { storage.popLast() }
    var top: Element? { storage.last }
}

var stack = Stack<Int>()
stack.push(1)
stack.push(2)
print(stack.pop()!) // 2

Type constraints — ограничения типов

Ограничения задаются через двоеточие: T: Protocol или T: Class. Можно накладывать несколько через запятую или через where.

// Одно ограничение: T должен соответствовать Comparable
func max<T: Comparable>(_ a: T, _ b: T) -> T {
    return a > b ? a : b
}

// Несколько ограничений через where
func printSorted<T>(_ items: [T]) where T: Comparable & CustomStringConvertible {
    items.sorted().forEach { print($0.description) }
}

// Ограничение на ассоциированный тип
func sum<C: Collection>(_ c: C) -> C.Element
    where C.Element: AdditiveArithmetic {
    c.reduce(.zero, +)
}

print(sum([1, 2, 3]))       // 6
print(sum([1.5, 2.5]))      // 4.0

where-clause в extension

Расширения можно добавлять только для определённых специализаций через where.

extension Stack where Element: Equatable {
    func contains(_ item: Element) -> Bool {
        storage.contains(item)
    }
}
// Stack<String> получает метод contains, Stack<URLRequest> — нет

Opaque types (some) vs generics

some Protocol — обратные обобщения (reverse generics). Тип знает реализацию, но скрывает её от вызывающего кода. Использутся в SwiftUI (var body: some View) и для стабильных API.

// some — компилятор знает конкретный тип, вызывающий — нет
func makeShape() -> some Shape {
    Circle(radius: 10)
}

// any — existential, тип неизвестен на этапе компиляции
func drawAll(_ shapes: [any Shape]) {
    shapes.forEach { $0.draw() }
}

Primary associated types (Swift 5.7)

Протоколы могут указывать primary associated type, что позволяет использовать синтаксис some Collection.

protocol Repository<Entity> {
    associatedtype Entity
    func findById(_ id: UUID) async throws -> Entity
}

struct UserRepository: Repository<User> {
    func findById(_ id: UUID) async throws -> User { ... }
}

func loadUser(from repo: some Repository<User>) async throws -> User {
    try await repo.findById(UUID())
}

Parameter packs (Swift 5.9)

Для функций с произвольным числом разнотипных аргументов используются parameter packs:

func zip<each T, each U>(
    _ firsts: repeat each T,
    _ seconds: repeat each U
) -> (repeat (each T, each U)) {
    return (repeat (each firsts, each seconds))
}

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

  • Specialization и размер бинарника: компилятор генерирует отдельный код для каждой специализации generic-функции; чрезмерное использование в библиотеках раздувает бинарник.
  • Protocol with associated type (PAT): до Swift 5.7 PAT нельзя было использовать как тип напрямую — только через some/any; старый код с AnyProtocol-обёртками теперь устарел, но ещё встречается.
  • where-клаузы не транзитивны: ограничение where T: Sendable в методе не означает, что контейнер Stack автоматически Sendable.
  • Рекурсивные обобщения: Swift имеет ограниченную поддержку рекурсивных generic-типов; сложные деревья типов могут не компилироваться или компилироваться экспоненциально долго.
  • Existential и Comparable: any Comparable не поддерживает оператор > напрямую — требуется обобщённая функция или some Comparable.
  • Conditional conformance и override: нельзя переопределить условное соответствие протоколу в подклассе — это ограничение системы типов Swift.
  • some в stored property: до Swift 5.7 some Protocol нельзя было использовать как тип хранимого свойства; теперь можно, но тип фиксируется при инициализации.

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

  • Сводить «generics в Swift и как использовать ограничения типов (type constraints)» к синтаксису и не объяснять система типов.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии swift-10.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

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

  • Формулирует точную модель для «generics в Swift и как использовать ограничения типов (type constraints)» и подтверждает ее корректным примером.
  • Умеет связать ответ с ARC, тестированием и отладкой на устройстве.
  • Называет ограничения подхода swift-10, включая производительность, память и сопровождение.

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

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

Источники

  • https://docs.swift.org/swift-book/LanguageGuide/Generics.html
←Предыдущий вопросЧто такое `@MainActor` в Swift и когда его следует использовать?Следующий вопрос→Представьте, сервис на Swift стал медленнее или нестабильнее после релиза. Какие language/runtime-specific причины вы проверите?

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

Swiftimplementation-reasoningMobile-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?