0Pricing
Swift Academy · Lekcja

Kompozycja wielu wrapperów właściwości

Łączenie wrapperów właściwości i poznanie kolejności ich inicjalizacji.

Kompozycja wielu wrapperów właściwości 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

Do jednej właściwości można zastosować wiele wrapperów właściwości. Kolejność ma znaczenie — zewnętrzne wrappery opakowują wewnętrzne — a kolejność inicjalizacji jest zgodna z kolejnością deklaracji.

Warstwowanie wrapperów

```swift @propertyWrapper struct A { var wrappedValue: Int { didSet { print("A") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } @propertyWrapper struct B { var wrappedValue: Int { didSet { print("B") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } struct S { @A @B var x = 0 } ```

Zewnętrzny wrapper opakowuje wewnętrzny

Po zapisaniu `@A @B var x` następuje desugaring: ```swift var _x: A> = A(wrappedValue: B(wrappedValue: 0)) ``` A opakowuje B, a B opakowuje Int.

Praktyczny przykład: @NonEmpty + @Trimmed

```swift @propertyWrapper struct Trimmed { var wrappedValue: String { didSet { wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } @propertyWrapper struct NonEmpty { var wrappedValue: String { didSet { if wrappedValue.isEmpty { wrappedValue = "(empty)" } } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.isEmpty ? "(empty)" : wrappedValue } } struct Form { @NonEmpty @Trimmed var username = " " } ```

Kolejność inicjalizacji

Wrappery są inicjalizowane od najbardziej zewnętrznego do najbardziej wewnętrznego. Oznacza to, że inicjalizator zewnętrznego wrappera otrzymuje wynik transformacji wewnętrznego wrappera — a nie wartość pierwotną.

Ograniczenia warstwowania

• Nie wszystkie wrappery można łatwo łączyć — należy sprawdzić, czy typy `wrappedValue` są zgodne • Kompilator Swift nie zawsze pozwala używać wielu wrapperów jednocześnie (zależy to od zgodności typów opakowywanych wartości) • Dostęp do `projectedValue` za pomocą `$x` obejmuje tylko projekcję najbardziej zewnętrznego wrappera

Przykład SwiftUI: @EnvironmentObject + Observation

SwiftUI nie pozwala łączyć `@EnvironmentObject` i `@Published` dla tej samej właściwości, ale można obserwować modele `@EnvironmentObject`, które wewnętrznie używają `@Published`.

Debugowanie warstwowanych wrapperów

Użyj `_propertyName`, aby uzyskać bezpośredni dostęp do instancji wrappera: ```swift print(form._username) // A> — the outer wrapper instance ```

Alternatywa: kompozycja wewnątrz jednego wrappera

Często czytelniejszym rozwiązaniem jest umieszczenie logiki kompozycji wewnątrz pojedynczego wrappera: ```swift @propertyWrapper struct CleanUsername { var wrappedValue: String { didSet { wrappedValue = clean(wrappedValue) } } func clean(_ s: String) -> String { let t = s.trimmingCharacters(in:.whitespaces) return t.isEmpty ? "(empty)" : t } } ```

Praktyczne wzorce warstwowania

Typowe poprawne zestawienia: • `@UserDefault` + `@Published` (trwałość danych + obserwacja) • `@NonNegative` + `@Clamped` (warstwy walidacji) • Specyficzne dla frameworka: `@Environment` + `@Binding` w widokach SwiftUI

Szybki test

Który z dwóch warstwowanych wrapperów jest inicjalizowany jako pierwszy?

Podsumowanie

Najważniejsze informacje: • `@A @B var x` zostaje rozwinięte do `A>` • Zewnętrzny wrapper jest inicjalizowany z `wrappedValue` wewnętrznego wrappera jako argumentem • `$x` zapewnia dostęp wyłącznie do `projectedValue` najbardziej zewnętrznego wrappera • `_x` zapewnia bezpośredni dostęp do instancji wrappera • Jeśli to możliwe, należy preferować jeden wrapper złożony zamiast głębokiego warstwowania Kurs ukończony! Następnie: typ Result.

Często zadawane pytania

Czy lekcja „Kompozycja wielu wrapperów właściwości” jest bezpłatna?

Tak — pełny tekst „Kompozycja wielu wrapperów właściwoś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 4 lekcji w sumie.

Co nauczysz się w „Kompozycja wielu wrapperów właściwości”?

Łączenie wrapperów właściwości i poznanie kolejności ich inicjalizacji. Ć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 „Kompozycja wielu wrapperów właściwoś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. Tworzenie niestandardowego wrappera właściwości
  2. Wartości projekcji za pomocą $binding
  3. @Published i obserwacja w Combine
  4. Kompozycja wielu wrapperów właściwości
← Powrót do Swift Academy