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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 124
  • Облачные технологии14 081
  • QA вакансии3 459
  • Backend вакансии2 116
  • Инженер данных1 804
  • Продакт-менеджер1 264

Разработка

  • Android1 866
  • iOS1 701
  • Fullstack вакансии988
  • AI вакансии952
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 662
  • Java6 548
  • Node.js2 019
  • .NET1 722
  • Kotlin1 619
  • Rust1 454
  • C#711
  • PHP683
  • C++571

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

  • Kubernetes7 766
  • DevOps вакансии6 053
  • Linux-инфраструктура5 491
  • Terraform / IaC4 262
  • CI/CD3 242
  • Мониторинг и Observability1 787
  • SRE567
  • Кибербезопасность453

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

  • Data Scientist1 140
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США44 297
  • Вакансии в Европе23 854
  • Вакансии в Канаде4 476
  • Работа в России3 921

По формату

  • Удалённые вакансии75 046
  • Релокация в США44 297
  • Гибридная работа12 398
  • Офисная работа7 076

По уровню

  • Senior вакансии42 676
  • Middle вакансии20 894
  • Junior вакансии6 725

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 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 нельзя было использовать как тип хранимого свойства; теперь можно, но тип фиксируется при инициализации.

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

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

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

  • Сводить «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 вакансии
  • Senior Engineering Manager, Co-Intelligent Coaching
  • Senior Software Engineer (iOS) – Digital Products
  • Senior Software Engineer, Bio - iOS
  • Middle iOS Engineer (Lviv only) (#6003)
  • Senior Calypso Support Analyst (Relocation to Sweden)