0Pricing
Swift Academy · Lekcja

Listy przechwytywania — weak/unowned i przechwytywanie wartości

Używajcie list przechwytywania do kontrolowania sposobu przechwytywania referencji i wartości przez closures: [weak self], unowned oraz migawki wartości pomagają unikać cykli retencji i trudnych do wykrycia błędów.

Listy przechwytywania — weak/unowned i przechwytywanie wartości to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 3. 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 3 lekcji w sumie.

Po co listy przechwytywania?

Cel: Kontroluj, co i jak przechwytuje closure. Używaj [weak self] lub unowned, aby uniknąć cykli silnych referencji, oraz przechwytuj migawki wartości, gdy jest to potrzebne.

Silne przechwytywanie = ryzyko cyklu

Closure przechowywane lub uciekające utrzymują przechwycone wartości. Silne przechwycenie self może w tym przypadku utworzyć cykl silnych referencji.

class Owner {
    var name = "Owner"
    var onDone: (() -> Void)?

    func start() {
        // Strong capture of self can cause a cycle if onDone is stored:
        onDone = {
            print("Done by", self.name) // self captured strongly
        }
    }
}
var o: Owner? = Owner()
o?.start()
// If nothing nils onDone or o, both can keep each other alive.

Wzorzec weak capture

Użyj [weak self], aby przerwać cykl. Wewnątrz closure self jest opcjonalne; rozpakuj je za pomocą guard let lub użyj optional chaining.

class Owner2 {
    var name = "Owner2"
    var onDone: (() -> Void)?

    func start() {
        onDone = { [weak self] in
            guard let self = self else { return }  // safely unwrap optional self
            print("Done by", self.name)
        }
    }
}
let o2 = Owner2()
o2.start()
o2.onDone?()

unowned (używaj ostrożnie)

unowned zakłada, że self będzie żyć dłużej niż closure (nie jest opcjonalne). Używaj go tylko wtedy, gdy masz pewność, że w chwili wywołania nie będzie nil.

class Owner3 {
    var onDone: (() -> Void)?
    func work() {
        onDone = { [unowned self] in
            // self must be alive when this runs; otherwise crash
            print("Owner3 still alive")
        }
    }
}
let o3 = Owner3()
o3.work()
o3.onDone?()

Idea migawki wartości

Listy przechwytywania mogą tworzyć migawki wartości, na przykład [n = count]. Bez listy stałe let znajdujące się wewnątrz closure również są przechwytywane podczas jego tworzenia.

var count = 0
let makeLogger: () -> () -> Void = {
    let snapshot = count     // captured by value at creation
    return {
        print("snapshot =", snapshot, "current =", count)
    }
}
count = 10
let logger = makeLogger()
count = 20
logger()   // snapshot = 10, current = 20

Powiązanie wartości w liście przechwytywania

Użyj listy przechwytywania, aby w chwili tworzenia closure utworzyć migawkę nazwanej wartości, na przykład [initial = total].

var total = 5
let closure = { [initial = total] in
    print("initial:", initial, " now:", total)
}
total = 9
closure()   // initial uses captured value 5

Po co weak self

Szybki test: Dlaczego dodaje się [weak self] do przechowywanego lub uciekającego closure?

Podsumowanie

Podsumowanie: Używaj [weak self], aby przerywać cykle (self staje się opcjonalne), stosuj unowned tylko wtedy, gdy czas życia jest zagwarantowany, i przechwytuj migawki wartości za pomocą powiązań w listach przechwytywania.

Często zadawane pytania

Czy lekcja „Listy przechwytywania — weak/unowned i przechwytywanie wartości” jest bezpłatna?

Tak — pełny tekst „Listy przechwytywania — weak/unowned i przechwytywanie wartości” 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 3 lekcji w sumie.

Co nauczysz się w „Listy przechwytywania — weak/unowned i przechwytywanie wartości”?

Używajcie list przechwytywania do kontrolowania sposobu przechwytywania referencji i wartości przez closures: [weak self], unowned oraz migawki wartości pomagają unikać cykli retencji i trudnych do w… Ć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 2 z 3.

Ile czasu zajmuje lekcja „Listy przechwytywania — weak/unowned i przechwytywanie wartości”?

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

  1. Podstawy closures i przechwytywania
  2. Listy przechwytywania — weak/unowned i przechwytywanie wartości
  3. Escaping a non-escaping, autoclosures
← Powrót do Swift Academy