Section 4/161 menit
4. Region-Based Isolation (Swift 6)
4. Region-Based Isolation (Swift 6)
Region-based isolation adalah fitur Swift 6 yang memungkinkan transfer nilai non-Sendable antar isolation domain jika compiler bisa membuktikan nilai itu tidak diakses lagi dari region asal.
Konsep Region
Setiap nilai hidup dalam sebuah "region". Region bisa:
- Digunakan lokal: nilai tidak pernah keluar isolation domain
- Dikirim (
sending): nilai dipindah ke domain lain, region asal tidak boleh akses lagi - Merged: dua region menjadi satu saat nilai dari dua region berinteraksi
swift
// Ilustrasi region tracking oleh compiler
func example() async {
let doc = Document() // doc ada di region R1
doc.content = "hello" // akses R1 — ✓
await processOnBackground(doc) // R1 "dikirim" ke domain lain
// R1 sekarang "consumed"
// doc.content = "world" // ❌ Compiler error: R1 sudah consumed
}
Transferring Values
Nilai non-Sendable bisa dikirim ke isolation domain lain jika compiler bisa membuktikan tidak ada akses konkuren:
swift
class Configuration { // Non-Sendable
var settings: [String: Any] = [:]
}
// Transfer ownership ke background task
func configureAndProcess() async {
let config = Configuration()
config.settings["theme"] = "dark"
config.settings["language"] = "id"
// Compiler analisis: setelah Task.detached, 'config' tidak digunakan lagi
// di scope ini → region merge dianggap aman
let result = await Task.detached {
// config digunakan di sini — satu-satunya yang akses
return processConfiguration(config)
}.value
print(result)
// config tidak diakses lagi di sini → tidak ada data race
}
// Jika masih diakses setelah transfer — compiler error
func unsafeExample() async {
let config = Configuration()
config.settings["key"] = "value"
Task.detached {
_ = processConfiguration(config)
}
config.settings["key"] = "modified" // ❌ Error: region sudah consumed
}
Isolation Region dalam Struct vs Class
swift
// Struct value semantics — copy membuat region baru
struct DTO {
var data: [String] = []
}
func useStruct() async {
let dto = DTO()
let copy = dto // Region baru — modifikasi independen
Task.detached { _ = copy.data } // copy di region baru — aman
// dto masih bisa digunakan
}
// Class reference semantics — sharing region
class Ref {
var data: [String] = []
}
func useClass() async {
let ref = Ref()
let alias = ref // SAMA region — bukan copy
Task.detached { _ = alias.data } // alias dan ref di region sama!
// ref.data = [] // ❌ Error: data race — alias sudah di task lain
}