9. Region-Based Isolation: Bagaimana Swift 6 Mengizinkan Transfer "Aman"
9. Region-Based Isolation: Bagaimana Swift 6 Mengizinkan Transfer "Aman"
Sebelum Swift 6, satu-satunya cara mengirim value ke actor lain adalah dengan Sendable. Tapi ini terlalu ketat — banyak case di mana value secara praktis aman ditransfer tapi tidak konform Sendable.
Swift 6 memperkenalkan region-based isolation: compiler menganalisis "wilayah" value dalam fungsi dan menentukan kapan transfer non-Sendable aman.
Apa Itu "Region"
Sebuah region adalah kumpulan value yang secara grafis terhubung (saling refer) dalam scope tertentu. Aturannya:
- Value yang dibuat di scope yang sama → di region yang sama.
- Mengembalikan / passing reference antar value menggabungkan region mereka.
- Memanggil method actor dengan reference dari region X → region X di-transfer ke actor.
Setelah transfer, caller tidak boleh mengakses value di region X lagi.
Contoh
actor Logger {
func log(_ event: LogEvent) async { /* ... */ }
}
// LogEvent non-Sendable (punya var properties)
final class LogEvent {
var message: String
var timestamp: Date
init(_ m: String) { message = m; timestamp = .now }
}
func emitEvent() async {
let event = LogEvent("user clicked button")
// event ada di region lokal
await logger.log(event) // transfer region ke logger
// event sekarang "consumed" — tidak boleh diakses lagi
}
Tanpa region analysis, ini akan error karena LogEvent bukan Sendable. Dengan region analysis (dan signature sending di parameter log), compiler bisa membuktikan: setelah await logger.log(event), tidak ada cara event masih dipakai di region kita.
Saat Region Tidak Aman
final class Shared {
var x = 0
}
func bad() async {
let s = Shared()
let t = s // t dan s di region yang sama
await actor.send(s) // transfer region
print(t.x) // ❌ Error: 't' is in transferred region
}
Bahkan kalau kita pakai variable t, region analysis tahu t di-refer ke object yang sama dengan s, jadi aksesnya juga dilarang.
Implikasi Praktis
- Builder pattern di actor jadi lebih mudah — bisa kirim non-Sendable builder yang baru dibuat.
- Closure capture jadi lebih fleksibel — kalau closure tidak share state, bisa di-Sendable secara region.
- Migration Swift 5 → 6 jadi lebih halus — banyak warning Sendable hilang setelah Swift 6 berubah ke complete checking dengan region analysis.
Cara Memicu Region Analysis di Code
Region analysis aktif otomatis di Swift 6 saat:
- Fungsi callee punya parameter
sending. - Compile flag complete concurrency checking diaktifkan.
- Caller mencoba mengirim value non-Sendable.
Tidak ada API user-facing untuk "force" region — ini sepenuhnya kerja compiler.