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)
}
}