Przechwytywanie wartości przez referencję
Poznanie, jak domknięcia przechwytują otaczający stan.
Przechwytywanie wartości przez referencję to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 1 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.
Co przechwytują domknięcia
Domknięcie przechwytuje zmienne i stałe z otaczającego zakresu, do których się odwołuje. Przechwycone zmienne są przechowywane przez referencję, więc domknięcie widzi ich późniejsze zmiany.
Przechwytywanie stałej
Domknięcie pamięta greeting nawet po zakończeniu działania funkcji:
func makeGreeter() -> () -> String {
let greeting = "Hello"
return { greeting }
}
let greet = makeGreeter()
print(greet()) // "Hello"Przechwytywanie zmiennej przez referencję
Ponieważ count jest zmienną typu var, domknięcie modyfikuje ten sam obszar pamięci przy kolejnych wywołaniach:
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next(), next(), next()) // 1 2 3Współdzielony obszar pamięci
Dwa domknięcia mogą przechwycić tę samą zmienną i widzieć nawzajem wprowadzane przez siebie zmiany:
func makePair() -> (() -> Void, () -> Int) {
var value = 0
let inc = { value += 1 }
let read = { value }
return (inc, read)
}
let (inc, read) = makePair()
inc(); inc()
print(read()) // 2Przechwycenie odzwierciedla późniejsze zmiany
Domknięcie odczytuje bieżącą wartość zmiennej w momencie wywołania, a nie jej wartość z chwili utworzenia domknięcia:
var message = "first"
let show = { print(message) }
message = "second"
show() // "second"Przechwytywanie przez referencję a przez wartość
Domyślnie zmienna, którą można modyfikować, jest przechwytywana przez referencję. Jeśli potrzebuje Pan/Pani niezmiennej kopii jej wartości z chwili utworzenia, należy umieścić ją na liście przechwytywania, na przykład [x].
Zamrażanie wartości
Lista przechwytywania natychmiast kopiuje wartość:
var n = 10
let frozen = { [n] in n } // copies 10 now
n = 99
print(frozen()) // 10Każde domknięcie ma niezależny stan
Każde wywołanie fabryki tworzy nową przechwyconą zmienną:
func counter() -> () -> Int {
var c = 0
return { c += 1; return c }
}
let a = counter(), b = counter()
print(a(), a(), b()) // 1 2 1Przechwytywanie w pętli
Bez zachowania ostrożności domknięcia w pętli mogą współdzielić tę samą zmienną. Należy użyć listy przechwytywania, aby utworzyć migawkę dla każdej iteracji:
var closures: [() -> Int] = []
for i in 1...3 {
closures.append { [i] in i }
}
print(closures.map { $0() }) // [1, 2, 3]Przechwytywanie self w metodzie
Domknięcie utworzone wewnątrz metody przechwytuje otaczającą instancję, dzięki czemu może później odczytywać i modyfikować właściwości:
class Bank {
var balance = 0
func deposit() -> () -> Void {
return { self.balance += 10 }
}
}
let bank = Bank()
let add = bank.deposit()
add(); add()
print(bank.balance) // 20Dlaczego ma to znaczenie
Przechwytywanie przez referencję umożliwia tworzenie liczników, akumulatorów i wywołań zwrotnych ze stanem — oznacza jednak również, że domknięcie może utrzymywać obiekty przy życiu, czym zajmiemy się w kolejnej części, poświęconej listom przechwytywania.
func accumulator() -> (Int) -> Int {
var total = 0
return { total += $0; return total }
}
let add = accumulator()
print(add(10), add(5)) // 10 15Szybkie sprawdzenie
W jaki sposób domknięcie domyślnie przechwytuje zmienną, którą można modyfikować?
Podsumowanie
Poznał(a) Pan/Pani zasady przechwytywania:
- Domknięcia przechwytują odwołujące się do nich zmienne z własnego zakresu
- Zmienne var są przechwytywane przez referencję — zmiany i modyfikacje są współdzielone
- Lista przechwytywania
[x]zamraża kopię wartości w chwili utworzenia - Umożliwia to tworzenie liczników i wywołań zwrotnych ze stanem
Dalej: domknięcia uciekające.
Często zadawane pytania
Czy lekcja „Przechwytywanie wartości przez referencję” jest bezpłatna?
Tak — pełny tekst „Przechwytywanie wartości przez referencję” 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 „Przechwytywanie wartości przez referencję”?
Poznanie, jak domknięcia przechwytują otaczający stan. Ć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 1 z 4.
Ile czasu zajmuje lekcja „Przechwytywanie wartości przez referencję”?
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
- Przechwytywanie wartości przez referencję
- Domknięcia uciekające
- Listy przechwytywania i weak self
- Autodomknięcia