Section 9/172 menit

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

swift
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

swift
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

  1. Builder pattern di actor jadi lebih mudah — bisa kirim non-Sendable builder yang baru dibuat.
  2. Closure capture jadi lebih fleksibel — kalau closure tidak share state, bisa di-Sendable secara region.
  3. 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.