Переход на строгую конкурентность
Постепенно внедряйте проверку конкурентности 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 — локальная установка не требуется.
Все уроки этого курса
- Проблема гонки данных
- Протокол Sendable
- Изоляция акторов и nonisolated
- Переход на строгую конкурентность