Swift Academy · Lekcja

Listy przechwytywania domknięć i [weak self]

Używanie list przechwytywania, aby zapobiec silnemu przechwytywaniu obiektów przez domknięcia.

Lekcja 4 z 412 kroki

Listy przechwytywania domknięć i [weak self] to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 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.

Wprowadzenie

Domknięcia przechwytują zmienne z otaczającego zakresu. Listy przechwytywania (`[weak self]`, `[unowned self]`, `[value]`) dokładnie określają sposób wykonywania tych przechwyceń.

Domyślne silne przechwytywanie

```swift var name = "Alice" let greet = { print("Hello, \(name)") } name = "Bob" greet() // "Hello, Bob" — closure sees current value ``` Domyślnie domknięcia przechwytują *referencje* do zmiennych.

Podstawy list przechwytywania

```swift var count = 10 let snapshot = { [count] in print(count) } // captures value count = 99 snapshot() // 10 — snapshot of count at capture time ``` Umieszczenie typu wartości w `[]` kopiuje tę wartość w chwili utworzenia domknięcia.

Wzorzec [weak self]

```swift class API { func fetch(completion: @escaping () -> Void) { ... } } class VC { func load() { api.fetch { [weak self] in guard let self else { return } // self might be nil by now self.updateUI() } } } ```

guard let self z przedłużonym czasem życia

Swift 5.3+: można ponownie powiązać `self` wewnątrz instrukcji guard bez tworzenia aliasu: ```swift { [weak self] in guard let self else { return } // 'self' is now strong within this block doA() doB() doC() } ```

[unowned self] — kiedy jest bezpieczne

```swift button.addTarget(self, action: #selector(tap), for: .touchUpInside) // If the button's closure is guaranteed not to outlive self: let action: () -> Void = { [unowned self] in self.handleTap() } ```

Przechwytywanie wielu wartości

```swift let base = 100 let multiplier = 2 let compute = { [base, multiplier] in base * multiplier } print(compute()) // 200 ``` W jednej liście można przechwycić wiele wartości, oddzielając je przecinkami.

Lista przechwytywania z nazwanymi powiązaniami

```swift let myService = service // rename in capture list: let handler = { [service = myService] in service.process() } ``` Jest to przydatne, gdy chcą Państwo przechwycić konkretną migawkę pod nową nazwą.

Escaping a non-escaping

• Domknięcie `@escaping` może zostać zapisane i wywołane po zwróceniu funkcji → ryzyko cykli • Domknięcie non-escaping jest wywoływane przed zwróceniem funkcji → brak ryzyka cyklu ```swift func apply(_ f: () -> Void) { f() } // non-escaping, no [weak] needed func later(_ f: @escaping () -> Void) { queue.async { f() } } // escaping ```

Debugowanie problemów z przechwytywaniem

Jeśli podejrzewają Państwo cykl: 1. Należy dodać `deinit { print("deallocated") }` do klasy 2. Należy przejść do innego widoku lub ustawić instancję na nil 3. Jeśli `deinit` niczego nie wypisze → istnieje cykl Następnie należy dodać `[weak self]` do domknięć w tej klasie.

Szybkie sprawdzenie

Co robi `[weak self]` na liście przechwytywania?

Podsumowanie

Najważniejsze informacje: • Domknięcia domyślnie przechwytują referencje • Lista przechwytywania `[value]` kopiuje typy wartości w chwili utworzenia • `[weak self]` — nie zwiększa licznika referencji, automatycznie przyjmuje wartość nil; należy używać `guard let self` • `[unowned self]` — nie zwiększa licznika referencji i nie jest bezpieczne dla wartości nil • Domknięcia `@escaping` wymagają list przechwytywania; domknięcia non-escaping zwykle ich nie wymagają Kurs ukończony! Następny temat: programowanie funkcyjne w Swift.
Bezpłatny start

Ucz się Swift dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
122
Lekcje
409

Często zadawane pytania

Czy lekcja „Listy przechwytywania domknięć i [weak self]” jest bezpłatna?

Tak — pełny tekst „Listy przechwytywania domknięć i [weak self]” 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 „Listy przechwytywania domknięć i [weak self]”?

Używanie list przechwytywania, aby zapobiec silnemu przechwytywaniu obiektów przez domknięcia. Ć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 4 z 4.

Ile czasu zajmuje lekcja „Listy przechwytywania domknięć i [weak self]”?

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. Jak ARC zlicza odwołania
  2. Cykle retain: przyczyny i wykrywanie
  3. Odwołania weak i unowned
  4. Listy przechwytywania domknięć i [weak self]
← Powrót do Swift Academy