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),