Section 5/101 menit

5. Strategi Migrasi Bertahap

5. Strategi Migrasi Bertahap

Fase 1: Upgrade Xcode, Keep Swift 5 (Zero Risk)

swift
Timeline: Minggu 1-2
Risiko:   Sangat Rendah
Action:   Upgrade ke Xcode 16, set SWIFT_VERSION = 5 di semua target
Hasil:    Swift 6 compiler, bahasa tetap Swift 5 — tidak ada perubahan perilaku
swift
// Package.swift — tidak ada perubahan di fase ini
.target(
    name: "MyApp"
    // Tidak ada swiftSettings — default ke Swift 5
)

Fase 2: Aktifkan Warning Concurrency (Targeted)

swift
Timeline: Minggu 2-4
Risiko:   Rendah (hanya warning, bukan error)
Action:   Aktifkan StrictConcurrency = targeted
Hasil:    Lihat warning, mulai fix satu per satu
swift
// Package.swift
.target(
    name: "MyApp",
    swiftSettings: [
        .swiftLanguageVersion(.v5),
        .enableUpcomingFeature("StrictConcurrency"),
    ]
)
swift
// xcconfig atau Build Settings (Xcode project)
SWIFT_STRICT_CONCURRENCY = targeted

Fase 3: Fix Warning Per Modul

swift
Timeline: Minggu 4-8 (bergantung ukuran codebase)
Risiko:   Sedang
Action:   Fix warning satu module/feature pada satu waktu
          Mulai dari layer paling dalam (model, service) → atas (UI)

Urutan yang direkomendasikan:

swift
1. Models & Entities      jadikan Sendable struct
2. Worker / Service       jadikan actor
3. Repository             jadikan actor atau @MainActor
4. ViewModel              @MainActor
5. ViewController / View  @MainActor
6. AppDelegate/SceneDelegate  @MainActor

Fase 4: Upgrade Target Satu per Satu ke Swift 6

swift
Timeline: Minggu 8-12
Risiko:   Sedang-Tinggi (warning jadi error)
Action:   Set SWIFT_VERSION = 6 per target, mulai dari yang paling sedikit warning
swift
// Package.swift — migrasi bertahap per target
.target(
    name: "Core",           // paling sedikit dependency, migrasikan duluan
    swiftSettings: [.swiftLanguageVersion(.v6)]
),
.target(
    name: "Features",
    dependencies: ["Core"],
    swiftSettings: [.swiftLanguageVersion(.v5),  // belum Swift 6
                    .enableUpcomingFeature("StrictConcurrency")]
),
.target(
    name: "UI",
    dependencies: ["Features"],
    swiftSettings: [.swiftLanguageVersion(.v5)]  // terakhir dimigrasikan
),

Fase 5: Full Swift 6

swift
Timeline: Bulan 3-4
Risiko:   Sesuai seberapa jauh persiapan di fase sebelumnya
Action:   Semua target ke Swift 6
swift
// Package.swift — semua target sudah Swift 6
let sharedSettings: [SwiftSetting] = [
    .swiftLanguageVersion(.v6)
]

.target(name: "Core", swiftSettings: sharedSettings),
.target(name: "Features", swiftSettings: sharedSettings),
.target(name: "UI", swiftSettings: sharedSettings),