Wrapper und projectedValue erstellen
Erstellen Sie einen eigenen Wrapper, konfigurieren Sie wrappedValue und stellen Sie Metadaten/Hilfsfunktionen mit projectedValue ( $ ) bereit.
Wrapper und projectedValue erstellen ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Warum Property Wrapper?
Ein Property Wrapper ist ein wiederverwendbarer Typ, der verwaltet, wie eine Eigenschaft gespeichert und gelesen wird:
- wrappedValue: der öffentliche Wert
- projectedValue: zusätzliche API über
$ - Konfiguration über Initializer/Argumente
Clamped + projiziertes Flag
@Clamped begrenzt eine Zahl auf einen Wertebereich. Der projectedValue ($hp) zeigt an, ob die letzte Zuweisung begrenzt wurde.
@propertyWrapper
struct Clamped {
private var value: Int
private let range: ClosedRange<Int>
private(set) var wasClampedLastSet = false
var wrappedValue: Int {
get { value }
set {
let clamped = min(max(newValue, range.lowerBound), range.upperBound)
wasClampedLastSet = (clamped != newValue)
value = clamped
}
}
var projectedValue: Bool { wasClampedLastSet } // $prop -> was it clamped?
init(wrappedValue: Int, range: ClosedRange<Int>) {
self.range = range
let clamped = min(max(wrappedValue, range.lowerBound), range.upperBound)
self.value = clamped
self.wasClampedLastSet = (clamped != wrappedValue)
}
}
struct Player {
@Clamped(range: 0...100) var hp: Int = 120 // init clamps to 100
}
var p = Player()
print(p.hp) // 100
p.hp = -5
print(p.hp, p.$hp) // 0 true (was clamped)Normalisieren und alternative Ansicht
Wrapper können Eingaben transformieren (trimmen/in Kleinbuchstaben umwandeln). $property kann eine praktische alternative Darstellung bereitstellen.
@propertyWrapper
struct Normalized {
private var storage: String = ""
var wrappedValue: String {
get { storage }
set { storage = newValue.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() }
}
var projectedValue: String { storage.uppercased() } // alternate view
init(wrappedValue: String) { self.wrappedValue = wrappedValue }
}
struct User {
@Normalized var username: String = " Alice "
}
let u = User()
print(u.username) // "alice"
print(u.$username) // "ALICE" (projected)Konfigurierbarer Wrapper
Übergeben Sie Wrappern Argumente (z. B. length). Der Wrapper wendet die Formatierung bei jeder Zuweisung der Eigenschaft an.
@propertyWrapper
struct Padded {
private var value: String
private let length: Int
var wrappedValue: String {
get { value }
set {
let s = newValue
value = s.count >= length ? String(s.prefix(length))
: s + String(repeating: " ", count: length - s.count)
}
}
var projectedValue: Int { value.count } // current width
init(wrappedValue: String, length: Int) {
self.length = length
self.value = ""
self.wrappedValue = wrappedValue
}
}
struct Row {
@Padded(length: 6) var code: String = "AB"
}
var r = Row()
print("|\(r.code)|") // |AB |
print(r.$code) // 6Verlauf über $value
Verwenden Sie projectedValue, um Metadaten wie einen Änderungsverlauf bereitzustellen, ohne die API des eigentlichen Werts zu überladen.
@propertyWrapper
struct History<Value> {
private var value: Value
private(set) var changes: [Value] = []
var wrappedValue: Value {
get { value }
set { changes.append(value); value = newValue }
}
var projectedValue: [Value] { changes } // $prop -> previous values
init(wrappedValue: Value) { self.value = wrappedValue }
}
struct Settings {
@History var level: Int = 1
}
var s = Settings()
s.level = 2
s.level = 3
print(s.level) // 3
print(s.$level) // [1, 2]Gestaltungshinweise
Tipps:
- Halten Sie Wrapper klein und zielgerichtet.
- Dokumentieren Sie, was $projectedValue bereitstellt.
- Bevorzugen Sie reine Transformationen und vermeiden Sie umfangreiche Nebenwirkungen.
- Stellen Sie klare Initializer und sinnvolle Standardwerte bereit.
Zweck des projizierten Werts
Kurztest: Wofür wird $property in Wrappern verwendet?
Zusammenfassung
Zusammenfassung: Implementieren Sie @propertyWrapper mit einem wrappedValue; stellen Sie Hilfsfunktionen, Flags und Verlauf über projectedValue ($) bereit und konfigurieren Sie das Verhalten über Initializer.
Häufig gestellte Fragen
Ist die Lektion „Wrapper und projectedValue erstellen“ kostenlos?
Ja — der vollständige Text von „Wrapper und projectedValue erstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Wrapper und projectedValue erstellen“?
Erstellen Sie einen eigenen Wrapper, konfigurieren Sie wrappedValue und stellen Sie Metadaten/Hilfsfunktionen mit projectedValue ( $ ) bereit. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 3.
Wie lange dauert die Lektion „Wrapper und projectedValue erstellen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Wrapper und projectedValue erstellen
- Wiederverwendbarkeit und Einschränkungen
- Gängige Wrapper-Muster (Validierung, Caching)