Section 6/201 menit

6. Complete Concurrency Checking

6. Complete Concurrency Checking

Teori: Dari Warning ke Error — Pergeseran Filosofi

Swift 5.x memperkenalkan concurrency tools tapi tidak meng-enforce keamanannya. Developer bisa mengabaikan warning. Swift 6 mengubah ini fundamental: semua data race check menjadi compile-time error.

Mengapa ini perubahan besar?

Data race adalah salah satu bug paling berbahaya di software:

  • Non-deterministic: hanya muncul dalam kondisi tertentu
  • Hard to reproduce: timing-dependent
  • Hard to debug: bisa muncul jauh dari source bug
  • Bisa corrupt memory, data, atau crash di production

Dengan Complete Concurrency Checking, Swift menjadi salah satu dari sedikit bahasa mainstream dengan compile-time data race safety — bergabung dengan Rust sebagai trailblazer di area ini.

Apa yang Di-check

swift
// SEBELUM Swift 6 (warning):
class AppState {
    var currentUser: User?  // mutable reference type
}

let state = AppState()
Task { state.currentUser = user1 }  // warning: concurrent access
Task { state.currentUser = user2 }  // warning: concurrent access

// SWIFT 6 (error):
// error: reference to var 'currentUser' in concurrently-executing code
// Tidak bisa dikompilasi — harus fix

Kategori error yang dideteksi:

  1. Akses ke non-Sendable type lintas isolation boundary
  2. Mutation dari state yang tidak dilindungi dari concurrent access
  3. Closure yang capture mutable state tanpa isolation
  4. Global variable yang mutable tanpa protection

Mengaktifkan Bertahap

swift
// Package.swift — aktifkan complete checking
.target(
    name: "MyTarget",
    swiftSettings: [
        // Level 1: minimal — hampir tidak ada warning
        // Level 2: targeted — warning pada kode yang jelas concurrent
        // Level 3: complete — semua warning Swift 6
        .enableUpcomingFeature("StrictConcurrency"),  // targeted di Swift 5
        // atau:
        .swiftLanguageVersion(.v6)  // complete, semua jadi error
    ]
)

Kapan Menggunakan

Complete Concurrency Checking selalu aktif di Swift 6 — bukan pilihan. Tapi kamu bisa mengontrol kapan bermigrasi:

  • Proyek baru: Langsung Swift 6 — mulai benar dari awal
  • Proyek existing: Aktifkan warning dulu (Targeted), fix bertahap, baru pindah ke Swift 6