Swift Academy · Pelajaran

Isolasi Actor dan nonisolated

Pelajari batas-batas isolasi.

Pelajaran 3 dari 413 langkah

Isolasi Actor dan nonisolated adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.

Apa Itu Isolasi Aktor?

Isolasi aktor berarti keadaan mutable sebuah aktor hanya dapat disentuh oleh kode yang berjalan pada aktor tersebut.

Waktu proses membuat akses berjalan secara berseri sehingga dua tugas tidak pernah mengubah keadaan secara bersamaan, dan perlombaan data pun dihilangkan.

actor Counter {
    private var value = 0
    func increment() { value += 1 }
}

Memanggil Aktor

Dari luar aktor, mengakses anggota yang terisolasi bersifat asinkron. Anda harus menggunakan await karena pemanggilan tersebut dapat ditangguhkan sampai aktor tersedia.

let counter = Counter()
func useCounter() async {
    await counter.increment()
}

Di Dalam Aktor: Sinkron

Di dalam metode milik aktor itu sendiri, Anda sudah terisolasi, sehingga dapat mengakses keadaan secara sinkron—tidak diperlukan await untuk self.

actor Counter {
    private var value = 0
    func incrementTwice() {
        value += 1 // synchronous: already isolated
        value += 1
    }
}

Anggota Tanpa Isolasi

Tandai sebuah anggota sebagai nonisolated jika anggota tersebut tidak menyentuh keadaan mutable. Anggota semacam ini berjalan secara sinkron dari mana saja, tanpa await.

Hal ini ideal untuk nilai terhitung yang hanya dibangun dari data yang tidak berubah.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    nonisolated var label: String { "User #\(id)" }
}

Mengapa Tanpa Isolasi Aman

Anggota nonisolated hanya boleh membaca keadaan yang tidak berubah (let) atau keadaan yang dapat dikirim.

Kompiler menolak setiap upaya mengakses keadaan terisolasi yang mutable dari konteks tanpa isolasi.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    // Error: cannot read mutable sessionCount here
    // nonisolated var bad: Int { sessionCount }
}

Tanpa Isolasi dan Protokol

nonisolated sangat penting ketika aktor memenuhi protokol sinkron. Metode protokol tidak dapat bersifat asinkron, sehingga metode tersebut harus menghindari keadaan terisolasi.

actor Item: CustomStringConvertible {
    let name: String
    init(name: String) { self.name = name }
    nonisolated var description: String { "Item: \(name)" }
}

MainActor

@MainActor adalah aktor global yang mengisolasi kode ke thread utama. Pembaruan UI seharusnya berada di sini.

Beri anotasi pada tipe, metode, atau properti untuk mengikatnya ke aktor utama.

@MainActor
final class ViewModel {
    var title = "Hello"
    func refresh() { title = "Updated" }
}

Berpindah Antar-Aktor

Ketika Anda memanggil dari satu aktor ke aktor lain, waktu proses berpindah ke eksekutor lain dan menangguhkan eksekusi. Penangguhan itulah tempat await muncul.

actor Database { func load() -> Int { 42 } }
@MainActor
func show(_ db: Database) async {
    let v = await db.load() // hop to db actor
    print(v)               // hop back to main
}

Reentransi Aktor

Aktor dapat dimasuki kembali: ketika sebuah metode menunggu, aktor dapat menjalankan pekerjaan lain yang telah diantrikan sebelum menunggu dilanjutkan.

Keadaan yang Anda baca sebelum await mungkin telah berubah setelahnya. Periksa kembali asumsi setelah titik penangguhan.

actor Store {
    var ready = false
    func prepare() async {
        ready = false
        await Task.yield() // other calls may run here
        ready = true
    }
}

Parameter Terisolasi

Sebuah fungsi dapat menerima parameter aktor isolated, lalu menjalankan tubuhnya pada aktor tersebut tanpa menjadi anggota aktor itu.

func bump(on counter: isolated Counter) {
    // runs isolated to counter; synchronous access
}

Aktor Global untuk Subsistem

Anda dapat mendefinisikan aktor global sendiri untuk mengisolasi seluruh subsistem, misalnya alur pemrosesan perenderan, pada satu eksekutor.

@globalActor
actor RenderActor {
    static let shared = RenderActor()
}
@RenderActor func draw() { }

Pemeriksaan Singkat: Isolasi

Uji pemahaman Anda tentang isolasi aktor.

Ringkasan: Isolasi Aktor dan Tanpa Isolasi

Isolasi aktor membuat akses ke keadaan mutable berjalan secara berseri; pemanggilan antar-aktor bersifat asinkron dan memerlukan await. Anggota nonisolated tidak mengikuti isolasi, tetapi hanya boleh membaca keadaan yang tidak berubah atau dapat dikirim, yang sangat penting untuk kesesuaian dengan protokol sinkron.

@MainActor mengikat kode ke thread utama, aktor dapat dimasuki kembali sehingga keadaan dapat berubah di antara await, dan aktor global mengisolasi seluruh subsistem. Menguasai aturan-aturan ini adalah inti dari konkurensi yang aman.

Gratis untuk memulai

Belajar Swift dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
122
Pelajaran
409

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Isolasi Actor dan nonisolated” gratis?

Ya — teks lengkap “Isolasi Actor dan nonisolated” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Isolasi Actor dan nonisolated”?

Pelajari batas-batas isolasi. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Isolasi Actor dan nonisolated” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Masalah Perlombaan Data
  2. Protocol Sendable
  3. Isolasi Actor dan nonisolated
  4. Migrasi ke Konkurensi Ketat
← Kembali ke Swift Academy