Section 14/201 menit

14. @isolated(any)

14. @isolated(any)

Teori: Function Type yang Isolation-Agnostic

@isolated(any) adalah annotation untuk function types yang memungkinkan fungsi tersebut membawa isolation context-nya sendiri. Ini berbeda dari fungsi biasa yang isolation-nya fixed saat definition.

Problem yang dipecahkan:

swift
// Swift 6.0: function type dengan isolation fixed
typealias MainActorAction = @MainActor () -> Void
typealias ActorAction = () -> Void  // tidak ada isolation info

// Bagaimana membuat function type yang bisa isolated ke actor APAPUN?
// Tidak bisa di Swift 6.0 — harus pilih satu
swift
// Swift 6.1: @isolated(any) — function type yang membawa isolation-nya sendiri
typealias IsolatedAction = @isolated(any) () -> Void

// IsolatedAction bisa di-create dari @MainActor context:
@MainActor func createMainActorAction() -> IsolatedAction {
    return { /* berjalan di @MainActor */ }
}

// Atau dari arbitrary actor:
actor MyActor {
    func createActorAction() -> IsolatedAction {
        return { /* berjalan di MyActor */ }
    }
}

// Caller bisa execute tanpa tahu isolation-nya:
func execute(_ action: @isolated(any) () async -> Void) async {
    await action()  // berjalan di isolation yang dibawa action
}

Kapan Menggunakan

Gunakan @isolated(any) ketika:

  • Membuat callback system yang harus menghormati isolation caller
  • Framework code yang perlu menjalankan user-provided closures di isolation yang tepat
  • Generic higher-order functions yang isolation-agnostic

Contoh nyata:

swift
// Event handler system yang respects isolation
struct EventHandler {
    let action: @isolated(any) (Event) async -> Void

    func handle(_ event: Event) async {
        await action(event)  // berjalan di isolation yang benar
    }
}

// Penggunaan dari @MainActor context:
@MainActor
class UIController {
    let handler = EventHandler { [weak self] event in
        // Closure ini dijalankan di @MainActor — aman untuk update UI
        self?.updateDisplay(for: event)
    }
}

// Penggunaan dari actor context:
actor BackgroundProcessor {
    let handler = EventHandler { [weak self] event in
        // Closure ini dijalankan di BackgroundProcessor actor
        await self?.processEvent(event)
    }
}

SWIFT 6.2 — ERGONOMICS (2025)