Section 1/101 menit

1. Masalah yang Dipecahkan

1. Masalah yang Dipecahkan

Sebelum Swift 6: Tooling yang Tidak Memadai

Developer iOS/macOS punya beberapa pilihan untuk synchronization, semua dengan masalahnya masing-masing:

NSLock + manual variable

swift
// Masalah: lock dan data terpisah — tidak ada yang mencegah akses tanpa lock
class Counter {
    private let lock = NSLock()
    private var value = 0  // tidak terkait dengan lock — bisa diakses langsung!
    
    func increment() {
        lock.lock()
        value += 1
        lock.unlock()  // mudah lupa, apalagi dengan early return atau throw
    }
    
    func dangerousRead() -> Int {
        return value  // ❌ tidak ada lock — developer bisa lupa ini
    }
}

DispatchQueue.sync

swift
// Masalah: verbose, bisa deadlock jika nested call ke queue yang sama
let queue = DispatchQueue(label: "com.app.counter")
var value = 0

func increment() {
    queue.sync { value += 1 }
}

func nestedCall() {
    queue.sync {           // deadlock jika ini dipanggil dari dalam queue yang sama!
        queue.sync { }     // ❌ deadlock
    }
}

OSAtomic (deprecated)

swift
// Deprecated di macOS 10.12 / iOS 10
// Tidak ada pengganti resmi yang type-safe di Swift sampai Swift 6
import Darwin
var counter: Int32 = 0
OSAtomicIncrement32(&counter)  // deprecated, Objective-C era

actor

swift
// Bagus untuk complex state, tapi overhead async untuk operasi sederhana
actor Counter {
    var value = 0
    func increment() { value += 1 }
}
let c = Counter()
Task { await c.increment() }  // overhead async untuk sekadar += 1

Swift 6 menghadirkan Mutex<Value> dan Atomic<Value> — dua primitive yang dirancang khusus untuk Swift's type system, aman, dan ergonomis.