0Pricing
Swift Academy · レッスン

厳密な並行性チェックへの移行

Swift 6の並行性チェックを段階的に導入します。

「厳密な並行性チェックへの移行」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

厳密な並行処理とは

厳密な並行処理チェックにより、データ競合の可能性をコンパイラーがすべてコンパイル時に診断します。

Swift 6言語モードではデフォルトで有効になり、Swift 5モードでは段階的にオプトインします。

3つのチェックレベル

-strict-concurrencyフラグには3つのレベルがあります。minimal(Swift 5のデフォルト)、targeted(すでに並行処理を使用しているコードをチェック)、complete(Swift 6形式の完全なチェック)です。

// Build settings example
// SWIFT_STRICT_CONCURRENCY = complete

段階的な導入

推奨される方法は、レベルを段階的に上げることです。まずtargetedから始めて警告を修正し、その後、言語モードを6に切り替える前にcompleteへ移行します。

これにより、大規模なコードベースでも移行を管理しやすくなります。

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

モジュール単位の移行

厳密な並行処理チェックはターゲット単位で設定されます。1つのモジュールずつ移行し、準備が整うまで他のモジュールをSwift 5モードのままにできます。

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

よくある警告:非Sendableのキャプチャ

最も頻繁に発生する診断は、Task内で非Sendableの値をキャプチャした場合や、アクターの境界を越えてその値を送った場合です。

型をSendableにするか、Sendableなデータだけをコピーして取り出すことで修正できます。

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

値型による修正

多くの場合、最もすっきりした修正方法は、データを不変の値型としてモデル化することです。値型は自動的にSendableになります。

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

@MainActorによる修正

UI型では、バックグラウンドタスクから触れられることが原因で警告が発生することがよくあります。型に@MainActorを付けるとメインスレッドに固定され、警告が解消されます。

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

既存の型へのSendable適合

自分で管理していて、すでにスレッドセーフな型には、明示的なSendableまたは@unchecked Sendable適合を追加して、警告を正しく解消できます。

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

Preconcurrencyインポート

依存関係のAPIにまだ注釈が付いていない場合、@preconcurrency importを使うとそのモジュールのチェックが緩和され、更新されるまでエラーが警告に引き下げられます。

@preconcurrency import SomeLegacyFramework

シンボルへの@preconcurrency付与

個々の宣言に@preconcurrencyを付けることもできます。これにより、Sendable要件を追加したとき、古いコードから呼び出している側でエラーが発生しなくなります。

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

移行の検証

completeチェックで警告がゼロになったら、ターゲットをSwift 6モードに切り替えます。これにより保証が強制的なエラーとして適用され、後から元に戻ることもありません。

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

理解度チェック:移行

厳密な並行処理への移行についての理解度を確認しましょう。

まとめ:厳密な並行処理への移行

厳密な並行処理チェックはデータ競合の検出をコンパイル時に移し、minimal、targeted、completeのレベルで構成できます。モジュール単位で移行し、非Sendableのキャプチャは値型、@MainActor、または正しいSendable適合で修正します。未移行の依存関係との相互運用には@preconcurrencyを使って移行を容易にします。

completeで警告がなくなったら、Swift 6モードを有効にして保証を確定させます。

よくある質問

「厳密な並行性チェックへの移行」レッスンは無料ですか?

はい。「厳密な並行性チェックへの移行」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「厳密な並行性チェックへの移行」で何を学びますか?

Swift 6の並行性チェックを段階的に導入します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「厳密な並行性チェックへの移行」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データ競合の問題
  2. Sendableプロトコル
  3. Actorの分離とnonisolated
  4. 厳密な並行性チェックへの移行
← Swift Academyに戻る