0Pricing
Swift Academy · Урок

Переход на строгую конкурентность

Постепенно внедряйте проверку конкурентности Swift 6.

«Переход на строгую конкурентность» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Что такое строгая проверка конкурентности

Строгая проверка конкурентности заставляет компилятор выявлять каждую потенциальную гонку данных во время компиляции.

В языковом режиме Swift 6 она включена по умолчанию; в режиме Swift 5 её включают постепенно.

Три уровня проверки

Флаг -strict-concurrency имеет три уровня: minimal (по умолчанию в Swift 5), targeted (проверяет код, уже использующий конкурентное выполнение) и complete (полная проверка в стиле Swift 6).

// Build settings example
// SWIFT_STRICT_CONCURRENCY = complete

Постепенное внедрение

Рекомендуемый путь — постепенно повышать уровни: начать с targeted, исправить предупреждения, а затем перейти к complete до переключения языкового режима на 6.

Так миграция остаётся управляемой даже в больших кодовых базах.

// Step 1: targeted
// Step 2: complete (warnings)
// Step 3: Swift 6 mode (errors)

Миграция по модулям

Строгая проверка конкурентности настраивается для каждого target. Можно переносить по одному модулю за раз, оставляя остальные в режиме Swift 5, пока они не будут готовы.

// Package.swift target
// swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]

Распространённое предупреждение: захват непередаваемого значения

Самое частое диагностическое сообщение — захват значения, не являющегося Sendable, в Task или его передача через границу актора.

Исправьте это, сделав тип передаваемым или скопировав только передаваемые данные.

final class Model { var name = "" }
func start(_ m: Model) {
    // Warning: non-Sendable Model captured by Task
    // Task { print(m.name) }
}

Исправление с помощью типов-значений

Часто самым чистым решением будет представить данные как неизменяемый тип-значение, который автоматически является передаваемым.

struct Model: Sendable { let name: String }
func start(_ m: Model) {
    Task { print(m.name) } // safe now
}

Исправление с помощью @MainActor

Типы пользовательского интерфейса часто вызывают предупреждения, поскольку к ним обращаются из фоновых задач. Аннотирование типа как @MainActor закрепляет его за главным потоком и устраняет предупреждения.

@MainActor
final class ViewModel {
    var items: [String] = []
    func reload() async {
        let fetched = await load()
        items = fetched
    }
}
func load() async -> [String] { [] }

Соответствие передаваемости для существующих типов

Для контролируемых Вами типов, которые уже являются потокобезопасными, добавьте явное соответствие Sendable или @unchecked Sendable, чтобы честно устранить предупреждения.

import Foundation
final class Counter: @unchecked Sendable {
    private let lock = NSLock()
    private var n = 0
}

Импорт до проверки конкурентности

Если зависимость ещё не аннотировала свой API, @preconcurrency import ослабляет проверку для этого модуля, понижая ошибки до предупреждений, пока зависимость не будет обновлена.

@preconcurrency import SomeLegacyFramework

Пометка символов @preconcurrency

Можно также пометить отдельные объявления как @preconcurrency, чтобы вызывающий код из старых версий не получал ошибок при добавлении требований Sendable.

@preconcurrency
func handle(_ value: Sendable) { }

Проверка миграции

Когда проверка complete не выдаёт ни одного предупреждения, переключите target в режим Swift 6, чтобы гарантии стали обязательными проверками и больше не могли ослабнуть.

// Package.swift
// .target(name: "App", swiftSettings: [.swiftLanguageMode(.v6)])

Быстрая проверка: миграция

Проверьте своё понимание миграции на строгую конкурентность.

Итоги: переход на строгую конкурентность

Строгая проверка конкурентности переносит обнаружение гонок данных на этап компиляции и имеет уровни minimal, targeted и complete. Выполняйте миграцию по модулям, исправляйте захваты непередаваемых значений с помощью типов-значений, @MainActor или честного соответствия Sendable, а для упрощения взаимодействия с ещё не перенесёнными зависимостями используйте @preconcurrency.

После устранения всех предупреждений на уровне complete включите режим Swift 6, чтобы закрепить гарантии.

Часто задаваемые вопросы

Урок «Переход на строгую конкурентность» бесплатный?

Да — полный текст урока «Переход на строгую конкурентность» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Переход на строгую конкурентность»?

Постепенно внедряйте проверку конкурентности Swift 6. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Переход на строгую конкурентность»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проблема гонки данных
  2. Протокол Sendable
  3. Изоляция акторов и nonisolated
  4. Переход на строгую конкурентность
← Назад к Swift Academy