Izolacja aktorów i nonisolated
Rozumowanie o granicach izolacji.
Izolacja aktorów i nonisolated to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Czym jest izolacja aktora?
Izolacja aktora oznacza, że do zmiennego stanu aktora może odwoływać się wyłącznie kod wykonywany w tym aktorze.
Środowisko uruchomieniowe szereguje dostęp, dzięki czemu dwa zadania nigdy nie modyfikują stanu jednocześnie, eliminując wyścigi danych.
actor Counter {
private var value = 0
func increment() { value += 1 }
}Wywoływanie aktora
Wywoływanie izolowanych elementów spoza aktora jest asynchroniczne. Należy użyć await, ponieważ wywołanie może zostać wstrzymane do czasu zwolnienia aktora.
let counter = Counter()
func useCounter() async {
await counter.increment()
}Wewnątrz aktora: synchronicznie
W obrębie własnych metod aktora kod jest już izolowany, więc można uzyskiwać dostęp do stanu synchronicznie — w przypadku self nie trzeba używać await.
actor Counter {
private var value = 0
func incrementTwice() {
value += 1 // synchronous: already isolated
value += 1
}
}Elementy nonisolated
Oznacz element jako nonisolated, gdy nie dotyka on zmiennego stanu. Takie elementy działają synchronicznie z dowolnego miejsca i nie wymagają await.
To idealne rozwiązanie dla wartości obliczanych wyłącznie na podstawie niemutowalnych danych.
actor User {
let id: Int
var sessionCount = 0
init(id: Int) { self.id = id }
nonisolated var label: String { "User #\(id)" }
}Dlaczego nonisolated jest bezpieczne
Element nonisolated może odczytywać wyłącznie stan niemutowalny (let) lub stan typu Sendable.
Kompilator odrzuca każdą próbę uzyskania dostępu do zmiennego, izolowanego stanu z kontekstu nonisolated.
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 }
}nonisolated a protokoły
nonisolated jest niezbędne, gdy aktor spełnia synchroniczny protokół. Metoda protokołu nie może być asynchroniczna, więc musi unikać izolowanego stanu.
actor Item: CustomStringConvertible {
let name: String
init(name: String) { self.name = name }
nonisolated var description: String { "Item: \(name)" }
}MainActor
@MainActor to globalny aktor, który izoluje kod w głównym wątku. Aktualizacje interfejsu użytkownika powinny odbywać się w tym miejscu.
Adnotuj typy, metody lub właściwości, aby przypisać je do głównego aktora.
@MainActor
final class ViewModel {
var title = "Hello"
func refresh() { title = "Updated" }
}Przechodzenie między aktorami
Podczas wywoływania jednego aktora z drugiego środowisko uruchomieniowe wykonuje przejście między executorami i wstrzymuje wykonywanie. To właśnie w tym miejscu pojawia się await.
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
}Reentrantność aktorów
Aktory są reentrant: gdy metoda wykonuje await, aktor może przed wznowieniem jej działania wykonać inne oczekujące zadania.
Stan odczytany przed await mógł zmienić się po jego zakończeniu. Po punktach wstrzymania należy ponownie sprawdzać założenia.
actor Store {
var ready = false
func prepare() async {
ready = false
await Task.yield() // other calls may run here
ready = true
}
}Parametry isolated
Funkcja może przyjmować parametr aktora oznaczony jako isolated i wykonywać swoje ciało w tym aktorze, mimo że sama nie jest jego elementem.
func bump(on counter: isolated Counter) {
// runs isolated to counter; synchronous access
}Globalne aktory dla podsystemów
Można zdefiniować własnego globalnego aktora, aby izolować cały podsystem, na przykład potok renderowania, na jednym executorze.
@globalActor
actor RenderActor {
static let shared = RenderActor()
}
@RenderActor func draw() { }Szybki sprawdzian: izolacja
Sprawdź swoją wiedzę na temat izolacji aktorów.
Podsumowanie: izolacja aktorów i nonisolated
Izolacja aktora szereguje dostęp do zmiennego stanu; wywołania między aktorami są asynchroniczne i wymagają await. Elementy nonisolated wyłączają się z izolacji, ale mogą odczytywać wyłącznie stan niemutowalny lub typu Sendable, co ma kluczowe znaczenie przy synchronicznym spełnianiu protokołów.
@MainActor przypisuje kod do głównego wątku, aktory są reentrantne (stan może zmienić się podczas await), a globalne aktory izolują całe podsystemy. Opanowanie tych zasad jest podstawą bezpiecznej współbieżności.
Często zadawane pytania
Czy lekcja „Izolacja aktorów i nonisolated” jest bezpłatna?
Tak — pełny tekst „Izolacja aktorów i nonisolated” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Izolacja aktorów i nonisolated”?
Rozumowanie o granicach izolacji. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Izolacja aktorów i nonisolated”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Problem wyścigu danych
- Protokół Sendable
- Izolacja aktorów i nonisolated
- Migracja do ścisłej współbieżności