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.