0Pricing
Swift Academy · Lekcja

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 3

Współ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())  // 2

Przechwycenie 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())  // 10

Każ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 1

Przechwytywanie 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)  // 20

Dlaczego 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 15

Szybkie 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

  1. Przechwytywanie wartości przez referencję
  2. Domknięcia uciekające
  3. Listy przechwytywania i weak self
  4. Autodomknięcia
← Powrót do Swift Academy